Funciones de conversión
# Funciones de conversión para crudo
## Metro cubico a barril (_p = precio, _q = cantidad)
conversor_m3bbl_p <- function(x) {x / 6.2898}
conversor_m3bbl_q <- function(x) {x * 6.2898}
# Funciones de conversión para gas
## Pies cúbico a metro cúbico
## 1ft³= 0.02831685m³
conversor_ft3m3_p <- function(x) {x / 0.02831685}
conversor_ft3m3_q <- function(x) {x * 0.02831685}
## Pie cúbico a Millón de BTU
# 1 ft3 = 0.001028 MM BTU
conversor_ft3MMBTU_q <- function(x) {x * 0.001028}
conversor_ft3MMBTU_p <- function(x) {x / 0.001028}
## Millón de BTU a metro cúbico
## 1 MM Btu = 27,8 m3 de gas (IAPG) ó 28.32861 m3 (Canada Energy Regulator)
conversor_MMBTUm3gas_p <- function(x) {x / 28.32861}
## m3 a MMBTU de gas
# 1 m3 = 0.0353 MM BTU (Canada Energy Regulator)
# otra opción 1 m3 = 34.121 MM BTU (BP)
conversor_m3MMBTU_q <- function(x){x * 0.0353}
conversor_m3MMBTU_p <- function(x){x / 0.0353}
## m3 a MMBTU (Alternativa, revisar)
# conversor_m3MMBTU_q <- function(x){x * 1/27.8}
# conversor_m3MMBTU_p <- function(x){x / 1/27.8}
## Conversión a BEP desde distintas medidas
conversor_m3bep_q <- function(x) {x * 5883}
conversor_MMBTUbep_q <- function(x) {x * 0.17245496} # BP
conversor_MMBTUbep_p <- function(x) {x / 0.17245496}
conversor_bepMMBTU_p <- function(x) {x / 5.798615}
Variables
Producción
Fuentes:
Producción de Crudo
La producción de petróleo crudo de largo plazo proviene del Anuario de Combustibles, de la cual contamos datos desde 1911 hasta 1992. Sus valores para el período 1980-1992 coinciden con los de EIA, por lo cual pueden usarse como fuentes alternativas. Asimismo, la evolución de SESCO es similar a la de EIA, salvo por pequeñas divergencias entre 2008 y 2013. La serie de Regalías presenta un nivel menor que las anteriores debido a las deducciones de producción que realizan las empresas para pagar un menor nivel de Regalías hacia las provincias donde realizan la producción. Por último, la serie del Ministerio de Economía coincide con Regalías en sus primeros años, luego presenta un nivel intermedio entre Regalías y SESCO y a partir de 2009 toma a SESCO como fuente. Salvo el Anuario de Combustibles, el resto de las series presentan datos hasta los últimos años. Por lo tanto, el criterio de selección para la serie de producción con la que se realizarán los cálculos es el siguiente:
- Criterio de cómputo para producicón de crudo:
- 1911 a 1992: Anuario de combustibles
- 1993 - actualidad: SESCO Downstream
Tabla 1. Producción de petróleo crudo en Argentina según distintas fuentes (barriles)
Producción de Gas Natural
Al igual que en la producción de petróleo crudo, la serie de largo plazo de producción de gas proviene del Anuario de Combustibles, de la cual contamos datos desde 1913 hasta 1992. A diferencia del crudo, sus valores para el período 1980-1992 no coinciden con los de EIA, pero está última sí coincide con los de Regalías entre 1999 y 2015. En cambio, la serie de SESCO, tiende a continuar la evolución de EIA y Regalías, pero con el nivel del Anuario de Combustibles, por lo que ambos pares de series pueden empalmar coherentemente según su nivel. Nuevamente, los valores de la base de Regalías son menores debido a las deducciones de producción para tributar menos regalías. La serie del Ministerio de Economía toma los valores de SESCO.Por lo tanto, el criterio de selección para la serie de producción de gas para los cálculos es el siguiente:
- Criterio de cómputo de la producción de gas:
- 1911 a 1992: Anuario de combustibles
- 1993 en adelante: SESCO Downstream
Registered S3 method overwritten by 'GGally':
method from
+.gg ggplot2
Tabla 2. Producción de gas natural en Argentina según distintas fuentes (MMBTU)
Produccion total
Joining, by = c("anio", "unidad")
Precio Mercado Interno
Fuentes:
- Base Ministerio de Hacienda, Informes Sectoriales
- Secretaría de Energía-Regalias
- Por ausencia de información, el precio de regalias entre 1993 y 1998 es el precio total (es decir, es un ponderado que incluye también el precio del mercado externo). En los años posteriores, dicho precio sí corresponde al del mercado interno.
- Kozulj y Pistonesi. Revista del Instituto de Economía Energética (IDEE) - Fundación Bariloche (1970 - 1988). Precio oficial interno de la cuenca neuquina a tasa de cambio oficial. Las fuentes utilizadas de esta revista son Secretaria de Energía, YPF, Gas del Estado, Boletin Informativo de Techint y series propias de IDEE
- Memoria Anual y balances contables de YPF (varios años). Precio intero promedio resultante de la relación entre ventas y cantidades producidas.
- Precios anuario. FALTA BUSCAR
ver de donde sacan el TCC cambiar precio del 92 por mecon estimado y valores restantes por estimado de idee
Precio Mercado Interno de Crudo
- Criterio para precio_crudo:
- 1963 a 1965: Kozulj y Pistonesi - Revista IDEE ajustado con el índice del precio del Anuario de YPF
- 1989 a 1991: Anuario de YPF
- 1966 a 1988: Kozulj y Pistonesi - Revista IDEE
- 1992: MECON ajustado con la variación del Índice de precios internos al por mayor (IPIM)
- 1993 en adelante: MECON
Tabla 3. Precio del mercado interno del petróleo crudo en Argentina según distintas fuentes (barriles)
Precio Mercado Interno de Gas Natural
- Precio Mercado Interno de gas:
- 1963 - 1969 & 1989 - 1992: Anuario de YPF
- 1970 - 1988: Kozulj y Pistonesi - Revista IDEE
- 1993 en adelante: Secretaría de Energía - Base Regalías
Tabla 4. Precio del mercado interno del gas natural en Argentina según distintas fuentes (barriles)
Precios de Referencia del Mercado Mundial
Precios de exportación desde Argentina, benchmarks y Precios del mercado de EEUU (solo gas, internos y de expo/impo)
- Secretaría de Energía-Regalias) (2006-hoy)
- MECON. Serie corta y sin transformaciones
- EIA
- Inflation Data (1946-hoy)
- Eurostat
- Revista IDEE
- Precio de Importación de gas natural desde Bolivia (1970-1988)
- UN Comtrade
- Precio de Exportación e Importación de gas y crudo (a Bolivia y promedio mundial)
- El precio impo bolivia de UN Comtrade cierra, da valores coherentes pero no deberia, dado que la conversión deberia realizarse multiplicando el precio en Mm3 por 1000 y ahí recién realizar la conversión
Precios de Referencia del Crudo
- Fuentes seleccionadas para precio_me_crudo:
- entre 1962 y 1992: precio de exportación argentina de UN Comtrade (clasificación SITC as reported)
- entre 1993-2001 y 2004-2014: precio de exportación argentina de Mecon
- entre 2002 y 2003: precio de exportación de Argentina de UN Comtrade (Clasificación HS as reported)
- 2014 en adelante: precio de exportación argentina de Secretaría de Energía (Regalías)
- Valores faltantes previos a 1992 (1970 - 1985): Brent (Fuente: Inflation Data)
Falta construir una paridad de expo/impo con el flete
Precios de Referencia del Gas
- Criterio de precio_externo_gas:
- Años 1964 y 1965: Precio de importación de gas proveniente de Bolivia hacia Argentina de UN Comtrade
- 1966 en adelante: Precio de exportacion de gas desde Bolivia a Argentina de UN Comtrade
- Datos faltantes para los años previos a 1963 y período 1968-1971
Exportación Argentina
Referencias mundiales
Bolivia
Todos los precios
buscamos un precio
cuanto es una cantidad de btu de gas al precio de referencia (ej bolivia) y cuanto es si convierto esos btu a barriles y los valorizo con el precio del barril? cuanto queda la unidad en btu si tomo el precio de petroleo y lo covierto a btu. es decir, cuanto es el valor si la valorizo en precio del petroleo
¿cuantos usd es un btu de petroleo? si tomo un barril de petroleo y lo convierto a btu ( me va a dar cuantos USD es un btu) luego comparo los USD/btu y lo comparo con el gas de bolivia
grinber: convierte todo el gas en petroleo y le pone el precio de petroeloe. subestima los precios del gas?
Exportaciones e Importaciones
Exportaciones e Importaciones de Crudo
- Exportaciones de Crudo:
- 1962 a 1993: UN Comtrade
- 1994 en adelante: SESCO Downstream
- Los datos faltantes de SESCO se completaron con MECON
- Siguen habiendo datos faltantes para los años 1965, 1970-74, 1976-78, 1980-84
Exportaciones e Importaciones de Gas
- Fuentes seleccionadas:
- 1962 a 1996: UN Comtrade,
- 1997 en adelante: SESCO Downstream
- Datos faltantes para los años 1999 y 2000
Empleo, Remuneraciones y Masa Salarial (CCNN)
Pozos
Metros perforados
Fuente:
Pozos en operación
Fuentes:
- Secretaría de Energía - Datos MINEM:
- IAPG. Se presentan dos series: una elaborada a partir de los pozos perforados por año (resultante de descargar una base por cada año del sitio web oficial) y otra que corresponde al stock de pozos de petróleo de extracción efectiva (procedente de los datos de Estadísticas del Centenario de IAPG).
ver relaciones * PBI hidrocarburos / PBI total (ver cual elegir) * corregir nuestro VBP depurando servicios * MIP’s coef tecnico (para ver CI en el sector petrolero y peso del sector petrolero en PBI)
- stock petrolero / stock total JIC,EM
- Stock extraccion = PPyE PAE + PPyE Tecp + PPyE Petrobras upstr + Activo YPF upstream
- ver que porcentaje que representan estas empresas en la produccion o pozos y ver de ampliarlo
- ver relacion Activo YPF upstream / PPyE integrada YPF
- ver relacion ganancias AFIP y BOLSAR con el stock correspondiente (coherencia)
- ver relacion con Coremberg
- pasar ENGE
grinberg convertir lo nuestro a costos. agarrar nuestros valor y dividirlo por barriles (sumando gas en BOE) * costos por bbl, precio el barril y precio de produccion (sumo la gcia normal al costo1)
Activos
Pasar datos de bs de uso en yacimientos para armar relación activo yacimeinto/total
Fuentes:
Balances de Bolsar (unicamente empresas que cotizan en la bolsa de valores argentina). Revisar el stock del sector distribución porque se presenta demasiado grande con respecto al de los demás. Falta pasar los datos del activo de casi todas las empresas
AFIP. Con esta fuente no tenemos calculo de renta, sino que solo usamos la TG como parámetro. Nota: "_c" significa casos presentados de la variable correspondiente
Memorias de YPF. La década de los 80 presenta picos que hay que revisar
Calculo del Capital Total Adelantado (KTA)
- Bolsar: Es equivalente a la suma de Propiedad, Planta y Equipos Neta (descontando los terrenos y obras en curso) y los Inventarios. Cuando los datos lo habilitan, se le agregó los salarios adelantados (salarios y cargas consumidos sobre rotación). Luego, cuando no se presentaron datos de Propiedad, Planta y Equipos, se tomó el activo no corriente.
- AFIP: Es equivalente a la suma de Bienes de Uso, Bienes de Cambio, Inventarios y Disponibilidades.
- Memoria YPF: Suma de Bienes de Uso y Bienes de Cambio
Stock de segmentos de YPF y Petrobras
YPF largo plazo
Comparación entre la Memoria YPF (recopilado por BFR) y los balances extríados de Bolsar
Estimación de stock de capital a partir de la evolución de pozos perforados
El ejercicio consiste en verificar si los pozos terminados sirven como indicador de la inversión y, por lo tanto, de aproximador al stock de capital adelantado. Para ello se parte de un año base de la serie de Propiedad, Planta y Equipo del sector extracción de Bolsar y AFIP, para luego indexar las variables por la evolución de los pozos. Los balances de Bolsar que corresponden únicamente a extracción son dos: PAE y Tecpetrol, por lo que el valor obtenido puede estar subrepresentado para dar cuenta del total de la rama. Con respecto al índice de pozos, se tomaron dos series alternativas: una construída a partir del stock de pozos en extracción efectiva (fuente: IAPG) y otra elaborada con los pozos terminados anuales cargados por empresa operadora (fuente: Secretaría de Energía).
El año base elegido es 2006, dado que es el último dato que poseemos del stock de pozos totales en actividad de IAPG.
Se realizó la misma estimación para YPF, filtrando las variables de Propiedad, Planta y Equipo (para el total de la empresa, por lo que incluye no sólo extracción sino refinación y otros rubros) y activo total del upstream. Se utilizó únicamente el indice de pozos terminados anuales de YPF para estimar la PPyE y el activo, dado que no se posee valores del stock de pozos en perforación para los años en donde existen valores contables que sirvan de año base. Luego, se estimó un stock de capital total de rama a partir de ponderar el stock de YPF por la relación entre los pozos de YPF y los pozos totales de la rama.
En síntesis, el listado de variables estimadas- a partir de las dos series de pozos (stock y flujo),salvo para la estimación de YPF que solo se pudo hacer con flujo de pozos por ausencia de información- es las siguientes:
\(ppye\_estimado\_bolsar\) = \(PPyE\ año\ base\ de\ Bolsar\) * \(indice\ de\ pozos\)
\(ppye\_estimado\_afip\) = \(PPyE\ año\ base\ de\ AFIP\) * \(indice\ de\ pozos\)
\(ppye\_estimado\_ypf\) = \(PPyE\ año\ base\ de\ YPF\) * \(indice\ de\ pozos\ YPF\)
\(activo\_estimado\_upstream\_ypf\) = \(Activo\ año\ base\ de\ YPF\) * \(indice\ de\ pozos\ YPF\)
\(ppye\_estimado\_total\) = \(ppye\_estimado\_ypf\) * \[\frac{pozos\ totales}{pozos\ de\ YPF}\]
\(activo\_estimado\_upstream\) = \(activo\_estimado\_upstream\_ypf\) * \[\frac{pozos\ totales}{pozos\ de\ YPF}\]
Para poder seleccionar la estimación más adecuada, se realizó un análisis de correlación entre todas las series estimadas y los valores contables que se poseen de PPyE de AFIP, Bolsar e YPF. Se presentan distintos cuadros de correlaciones, con sus nivles de significancia, diagramas de dispersión entre variables y su distribución. Las series construídas que poseen mejor correlación son la Propiedad, Planta y Equipo a partir de Bolsar estimadas con índice de stock de pozos (correlación fuerte de 0.89 y significativa al 0.001) y flujo de pozos (correlación moderada de 0.54 y significativa al 0.05) y luego el activo del upstream total de la rama a partir de YPF (correlación moderada de 0.42 y significativa al 0.1 con los valores contables de YPF y correlación fuerte de 0.88 y significativa al 0.001 con las estimaciones de PPyE de AFIP y Bolsar a partir de flujo de pozos).
la estimación tiene que realizarse con PPyE porque hay que excluir salarios e inventarios (que están en KTA)
Análisis de correlacion entre Propiedad, Planta y Equipo y Pozos en producción
reemplazar ipc por un ibif o indice especifico
Total rama


ppye_afip ppye_bolsar pozos_iapg pozos_terminados pozos_cargados
ppye_afip 1.0000000 0.1743854 -0.2930975 -0.6054224 -0.3793896
ppye_bolsar 0.1743854 1.0000000 -0.4269400 -0.5803358 -0.3213849
pozos_iapg -0.2930975 -0.4269400 1.0000000 0.8924037 0.9611781
pozos_terminados -0.6054224 -0.5803358 0.8924037 1.0000000 0.8696256
pozos_cargados -0.3793896 -0.3213849 0.9611781 0.8696256 1.0000000

Joining, by = c("anio", "unidad")
Stock de pozos


ppye_afip ppye_bolsar pozos_iapg
ppye_afip 1.0000000 0.8382675 -0.9152596
ppye_bolsar 0.8382675 1.0000000 -0.9096424
pozos_iapg -0.9152596 -0.9096424 1.0000000

YPF
activo_upstream ppye_integrada pozos
activo_upstream 1.0000000 0.22492855 0.51192183
ppye_integrada 0.2249285 1.00000000 0.06456351
pozos 0.5119218 0.06456351 1.00000000




PPyE y activo upstream total rama a partir de YPF
`summarise()` has grouped output by 'anio'. You can override using the `.groups` argument.
Joining, by = "anio"
Joining, by = "anio"

Inversiones
Fuentes:
- Balances de Bolsar. Inversión calculada a partir de variaciones del activo + consumo de capital fijo (esto último está pendiente)
- Secretaria de Energía. Resolución 2057
- construir serie de inversión para atras (buscar Stock de YPF pero solo para extracción). armar ejercicio de FD y ver si las proporciones se mantienen.
Reconstruccion de serie de inversion por empresa ver un flujo de pozos y un flujo de inversion y luego ver si lo que mueve la inversion son los pozos (que su evolucion sea similar).
inversion por empresa (balance: variacion del activo + consumo de K fijo)
inversion por empresa (secretaria de energia)
inversion agregada (tipo de inversion) (cuentas nacionales?)
pozos nuevos por empresa por año
pozos nuevos totales
aplicar MIP para YPF
Inversión a partir de Balances
Inversión a partir de Secretaria de Energía
Análisis de correlación entre Inversión y Pozos
- buscar correlacion, para ver si la serie de inversión se mueve similar a los pozos
- usar stock y ademas usar variacion de stock (bs de uso)
Con pozos de IAPG
Con pozos Cap IV
Regalías
- Fuentes:
- Secretaría de Energía (Base Regalías)
REVISAR EL CALCULO DE BETANIA cuanto ganarian las provincias si el precio del mercado interno se acomoda al internacional?
Subsidios
Joining, by = "anio"
NAs introducidos por coerci昼㸳n
Valor total de la producción
Criterios metodológicos
Se presentan a continuación distintas estimaciones sobre la magnitud de riqueza presente en el sector hidrocarburífero: Valor Bruto y Agregado de Producción (VBP y VA), Consumo Interemedio (CI), Masa Salarial (MS) y Excedente Bruto de Explotación (EBE). El VBP surge de la valuación de la producción a sus precios correspondientes. El VA resulta de la diferencia entre el VBP y CI, el cual puede surgir originalmente de esta resta o a partir del coeficiente técnico de la Matriz Insumo Producto (MIP). El EBE constituye la plusvalía (PV) total de la rama, es decir, la suma de la renta de la tierra (RT) más la ganancia normal (Gnorm), y se obtiene luego de descontar la MS y los impuestos específicos (Imp) del VA. En todos los casos que se presentarán a continuación, los Imp se calcularon a partir de aplicar sobre el VBP un coeficiente resultante del peso de los impuestos promedio de la MIP de 1997. Lo mismo pasa con la estimación de la depreciación de capital o consumo de capital fijo (ConsKfijo), que se obtiene a partir de aplicar la tasa de depreciación promedio resultante de los balances de YPF (1998 - 2018) sobre el total de Propiedad, Planta y Equipo (PPyE) de la rama. Esta partida se aplica para obtener el Excedente Neto de Explotación. Se presentan distintas estimaciones para el VBP, CI y MS, que luego se observarán en la formulación matemática:
- CCNN (ccnn_oficial)
- Valores contables oficiales de las Cuentas Nacionales (sólo disponible para el período 2004-2012). Dado que se presentan series de VBP y VA, se pudo estimar el CI como la diferencia de dichas cuentas. Se procedió a separar el VBP a partir del peso del VBP de los servicios de apoyo a la extracción sobre el VBP de extracción de petróleo y gas, presente en el Cuadro de Utilización de Oferta (COU) de 2004 de INDEC. Se descontó esta proporción (resultante del 10,7%) del VBP total para obtener un VBP sólo de extracción. Dado que se posee información del salario promedio del sector y el empleo, se pudo obtener la MS resultante, tanto para el total del sector (extracción y servicios relacionados) como para sólo extracción. A partir de estos datos se elaboró un coeficiente que refleja el promedio de la proporción de la MS sobre el VBP que se utilizará en cálculos posteriores de MS total y MS de extracción.
- Estimación propia con criterio CCNN (vbp_va_ci_propia)
- Estimación propia de los valores contables a partir de las fuentes recopiladas, siguiendo los criterios de las Cuentas Nacionales. Es decir, para obtener el VBP se valua la producción destinada al mercado interno (resultante a partir de la diferencia entre producción y exportaciones) con los precios internos y las exportaciones con los precios de exportación, valuados tipo de cambio comercial (TCC). Se procedió también a separar el VBP de extracción neto de los servicios tal como se explicó anteriormente. El CI se estimó a partir de aplicar el coeficiente técnico (ratio CI/VBP) resultante de la MIP de 1997 (equivalente a 0.272). De igual manera, para calcular la masa salarial se aplicó el coeficiente de MS mencionado anteriormente. Finalmente, como se mencionó anteriormente, el VA el EBE se calcularon a partir de las diferencias mencionadas anteriormente.
- Empalme CCNN (vbp_ccnn)
- Estimación que toma los valores oficiales de las cuentas nacionales para el período donde se presentan datos (2004 -2012) y que imputa los valores faltantes por medio de la evolución del índice del VBP propio con criterio CCNN explicado anteriormente. Asimismo, se utilizaron los valores oficiales de la MS cuando se encontraba disponible el dato (1996-2018), mientras que se utilizó el valor propio estimado con criterio de las CCNN para los restantes años.
- Criterio Propio (pv_hidrocarburos_propia)
- Estimación propia que refleja con mayor precisión el valor de la riqueza total presente en el sector. El VBP se obtiene a paritr de valuar la totalidad de la producción a los precios externos o de referencia internacional y con el tipo de cambio de paridad (TCP), que mide la capacidad real de compra de la moneda nacional. Sin embargo, como el CI constituye intercambios de mercancías realizadas en el ámbito nacional, dicha partida se obtiene a partir de los valores obtenidos en la serie de empalme CCNN. De igual manera, se utilizó la MS resultante de esta última estimación.
Formulación matemática de estimaciones
Valor Bruto de Producción total, estimación con criterio propio \[VBP_{propia} = (Pext_{petróleo} * Q_{petróleo} + Pext_{gas} * Q_{gas}) * TCP\]
Donde:
- \(VBP_{propia}\) = Valor Bruto de la Producción total, estimación propia
- \(Pext_{petróleo}\) = Precio de exportación o referencia internacional del petróleo crudo (según corresponda)
- \(Pext_{gas}\) = Precio de exportación o referencia internacional del gas natural (según corresponda)
- \(Q_{petróleo}\) = Cantidades producidas totales de petróleo crudo
- \(Q_{gas}\) = Cantidades producidas totales de gas natural
- \(TCP\) = Tipo de Cambio de Paridad
Valor Bruto de Producción total, estimación con criterio CCNN \[VBP_{CCNN} = (Pint_{petróleo} * QMInt_{petróleo} + Pext_{petróleo} * Expo_{petróleo} + Pint_{gas} * QMInt_{gas} + Pext_{gas} * Expo_{gas})* TCC\]
Donde:
- \(VBP_{CCNN}\) = Valor Bruto de la Producción total, estimación propia con criterio de las CCNN
- \(Pint_{petróleo}\) = Precio mercado interno del petróleo crudo
- \(Pint_{gas}\) = Precio mercado interno del gas natural
- \(QMInt_{petróleo}\) = cantidades vendidas al mercado interno de petróleo crudo
- \(QMInt_{gas}\) = cantidades vendidas al mercado interno del gas natural
- \(Expo_{petróleo}\) = exportaciones de petróleo crudo
- \(Expo_{gas}\) = exportaciones de gas natural
- \(TCC\) = Tipo de Cambio Comercial
Valor Bruto de Producción extracción, estimación con criterio CCNN
\[VBP\_extr_{CCNN} = VBP_{CCNN} * (1-prop\_servicios)\]
Donde:
- \(VBP\_extr_{CCNN}\) = Valor Bruto de la Producción extracción, estimación propia con criterio de las CCNN
- \(prop\_extr\) = proporción del VBP de servicios de apoyo sobre VBP de extracción de petróleo y gas
Proporción de los servicios de apoyo sobre la extracción de petróleo y gas
\[prop\_servicios = \frac{VBP\_servicios_{COU}}{VBP\_extr_{COU} + VBP\_servicios_{COU}}\]
Donde:
- \(VBP\_servicios_{COU}\) = VBP de servicios de apoyo del Cuadro de Utilización de Oferta
- \(VBP\_extracción_{COU}\) = VBP de extracción de petróleo y gas del Cuadro de Utilización de Oferta
Consumo Intermedio, valores oficiales de las CCNN \[ CI_{CCNN} = VBP_{CCNN} - VA_{CCNN} \]
Donde:
- \(CI_{CCNN}\) = Consumo Intermedio total, estimación propia
- \(VA_{CCNN}\) = Valor Agregado, estimación de las CCNN
Consumo Intermedio, estimación con criterio CCNN \[ CI_{CCNN} = VBP_{CCNN} * Coef\_tec \] Donde:
- \(Coef\_tec\) = Coeficiente técnico de Matriz Insumo Producto
Consumo Intermedio de extracción, estimación con criterio CCNN
\[ CI\_extr_{CCNN} = VBP\_extr_{CCNN} * Coef\_tec \]
Donde:
- $ CI_extr_{CCNN}$ = Consumo Intermedio de extracción, estimación criterio CCNN
Masa Salarial, valores oficiales de las CCNN \[MS = W * Emp * 13\] Donde:
- \(MS\) = Masa Salarial
- \(W\) = Salario anual promedio
- \(Emp\) = Empleo
Masa Salarial, estimación con criterio CCNN \[MS = VBP_{CCNN} * Coef\_MS\]
Donde:
- \(Coef\_MS\) = Coeficiente de la proporción de MS sobre VBP
Masa Salarial de extracción, estimación con criterio CCNN \[MS\_extr = VBP\_extr_{CCNN} * Coef\_MS\]
Donde:
- \(MS\_extr\) = Masa salarial del sector extracción
Valor agregado, estimación criterio CCNN \[VA_{CCNN} = VBP_{CCNN} – CI_{CCNN} \] Donde:
- \(VA_{CCNN}\) = Valor Agregado, estimación propia con criterio CCNN
Valor agregado de extracción, estimación con criterio CCNN \[VA\_extr_{CCNN} = VBP\_extr_{CCNN} – CI\_extr_{CCNN} \]
Donde:
- \(VA\_extr_{CCNN}\) = Valor Agregado de extracción, estimación propia con criterio CCNN
Valor agregado, estimación con criterio propio \[VA_{propia} = VBP_{propia} – CI\_extr_{CCNN} \]
Donde:
- \(VA_{propia}\) = Valor Agregado, estimación con criterio propio
Excedente Bruto de Explotación, estimación con criterio CCNN \[EBE_{CCNN} = VA_{CCNN} – MS \]
Excedente Bruto de Explotación de extracción, estimación con criterio CCNN \[EBE\_extr_{CCNN} = VA\_extr_{CCNN} – MS\_extr \]
Excedente Bruto de Explotación, estimación con criterio propio \[EBE_{propia} = VA_{propia} – MS\_extr \]
Donde:
- \(EBE\) = Excedente Bruto de Explotación
- \(CI\_extr_{CCNN}\) = Consumo intermedio del sector extracción, estimación con criterio CCNN
Consumo de Capital Fijo, estimación con criterio propio \[ConKfijo = PPyE * prom(\frac{Dep}{PPyE}) \]
Donde:
- \(ConKfijo\) = Consumo de Capital Fijo
- \(PPyE\)= Propiedad, Planta y Equipo neta
- $prom() $ = tasa de depreciación promedio
- \(Dep\) = Depreciaciones (cuenta gastos por naturaleza)
Plusvalía (Excedente Neto de Explotación), estimación con criterio propio \[PV_{propia} = VA_{propia} - ConKfijo - Imp \]
Donde:
- \(PV_{propia}\) = Plusvalía (Excedente Neto de Explotación)
- \(Imp\) = Impuestos normales
Fuentes para la construcción de series
- Producción de Crudo:
- 1911 a 1992: Anuario de combustibles
- 1993 - actualidad: SESCO Downstream
- Exportaciones de Crudo:
- 1962 a 1993: UN Comtrade (clasificación SITC as reported)
- 1994 en adelante: SESCO Downstream
- Los datos faltantes de SESCO se completaron con MECON
- Siguen habiendo datos faltantes para los años 1965, 1970-74, 1976-78, 1980-84
- Precio Mercado Interno de Crudo:
- 1963 a 1965: Kozulj y Pistonesi - Revista IDEE ajustado con el índice del precio del Anuario de YPF
- 1989 a 1991: Anuario de YPF
- 1966 a 1988: Kozulj y Pistonesi - Revista IDEE
- 1992: MECON ajustado con la variación del Índice de precios internos al por mayor (IPIM)
- 1993 en adelante: MECON
- Precio Mercado Externo Crudo:
- entre 1962 y 1992: precio de exportación argentina de UN Comtrade
- entre 1993-2001 y 2004-2014: precio de exportación argentina de Mecon
- entre 2002 y 2003: precio de exportación de Argentina de UN Comtrade (Clasificación HS as reported)
- 2014 en adelante: precio de exportación argentina de Secretaría de Energía (Regalías)
- Valores faltantes previos a 1992: Brent (Fuente: Inflation Data)
- Producción de Gas:
- 1911 a 1992: Anuario de combustibles
- 1993 en adelante: SESCO Downstream
- Exportaciones de gas:
- 1962 a 1996: UN Comtrade,
- 1997 en adelante: SESCO Downstream
- Datos faltantes para los años 1999 y 2000
- Precio Mercado Interno de gas:
- 1963 - 1969 & 1989 - 1992: Anuario de YPF
- 1970 - 1988: Kozulj y Pistonesi - Revista IDEE
- 1993 en adelante: Secretaría de Energía - Base Regalías
- El dato del año 1992 se dividió por 10, dado que resultaba excesivamente alto, lo cual es metodológicamente inaceptable pero sirve de ejercicio.
- Precio Mercado Externo:
- Años 1964 y 1965: Precio de importación de gas proveniente de Bolivia hacia Argentina de UN Comtrade
- 1966 en adelante: Precio de exportacion de gas desde Bolivia a Argentina de UN Comtrade
- Datos faltantes para los años previos a 1963 y período 1968-1971
- Valor Bruto de la Producción, Valor Agregado y Consumo Intermedio:
- INDEC - Dirección Nacional de Cuentas Nacionales (Base Minería e Hidrocarburos de las Cuentas Nacionales). Las variables “extraccion_y_servicios_hidrocarburos” refieren a “Extracción de petróleo crudo y gas natural. Actividades de servicios relacionadas con la extracción de petróleo y gas, excepto las actividades de prospección”
- Cálculo propio del VBP con datos datos de producción y precio internacional recopilados. Las fuentes son las siguientes (los criterios son los mismos para la utilización posterior en el cálculo de renta de la tierra hidrocarburífera por diferencial de precios, sobrevaluación cambiaria y otros mecanismos)
- Salario y empleo
- 1960-1996: estimación a partir de aplicación del coeficiente de proporción de la masa salarial sobre el VBP
- 1996 en adelante: Ministerio de Trabajo, Empleo y Seguridad Social - Observatorio de Empleo y Dinámica Empresarial (OEDE)
- Consumo de capital fijo
- Coeficiente de depreciación estimado a partir de Estados Contables de YPF (1998-2018)
Tasa de Ganancia
\[TG_{hidrocarburos} = \frac{PV_{hidrocarburífera}}{KTA_{hidrocarburífero}}\]



Renta apropiada por las empresas de la rama
La renta apropiada por las empresas de la rama se calcula por medio del diferencial de tasas de ganancia entre el sector hidrocarburífero que surge a partir de los balances y la rentabilidad normal de la economía.
\[Renta\_empresas = KTA_{hidrocarburífero} * (TG_{hidrocarburífera} - TG_{referencia})\] \[TG_{hidrocarburífera} = \frac{Gcia_{hidrocarburos}}{KTA_{hidrocarburífero}}\] Por lo cual, la renta apropiada por las empresas de la rama sería equivalente a:
\[Renta\_empresas = Gcia_{hidrocarburos} - KTA_{hidrocarburífero} * TG_{referencia}\]
Donde:
- \(KTA_{hidrocarburífero}\) = Stock de capital adelantado de empresas hidrocarburíferas
- \(TG_{hidrocarburífera}\) = Tasa de ganancia de empresas hidrocarburíferas
- \(TG_{referencia}\) = Tasa de ganancia de referencia
- \(Gcia_{hidrocarburos}\) = Ganancia de empresas hidrocarburíferas
Joining, by = "anio"
Renta por el diferencial de precios entre el mercado interno y las referencias internacionales
Renta apropiada mediante el abaratamiento en el consumo interno por efecto del diferencial de precios interno/externo, sobrevaluación de la moneda y retenciones a la exportación
Criterio de cómputo de JK (variable ‘renta_dif_precios’)
\[RDP= ProdInt * Pext * TCP - ProdInt * PMI * TCC\]
Donde:
- \(RDP\) = Renta apropiada por efecto diferencial de precios interno/externo y sobrevaluación
- \(MdoInt\) = Producción destinada al Mercado Interno: Producción - Exportaciones - Existencias (barriles de petróleo ó MMBTU)
- \(Pext\) = Precio de referencia del mercado externo (USD)
- \(PMI\) = Precio de venta del mercado interno (USD)
- \(TCP\) = Tipo de Cambio de Paridad
- \(TCC\) = Tipo de Cambio Comercial
Criterio de cómputo de JIC y cia (variable ‘renta_abaratamiento_sobrevaluacion’)
\[RDP = MdoInt * PMI * (\frac{TCP}{TCC} - 1)\]


Renta apropiada por sobrevaluación cambiaria
\[Rsobrevaluacion = Expo * Pext * (TCP - TCC)\]
Donde: * \(Rsobrevaluacion\) = Renta apropiada por exportaciones con tipo de cambio sobrevaluado * \(Expo\) = Exportaciones (barriles de petróleo ó MMBTU) * \(Pext\) = Precio de referencia del mercado externo (USD) * \(TCP\) = Tipo de Cambio de Paridad * \(TCC\) = Tipo de Cambio Comercial
Joining, by = "anio"
Renta apropiada por consumidores y refinerías y procesadoras
Criterio de cómputo de Ramón (2019)
Refinerías y procesadoras
\[RR = (PI - PRMi) * CrudoP\]
- \(RR\) = Renta apropiada por las Refinadoras
- \(PI\) = promedio ponderado de Precios Internacionales
- \(PRMi\) = Precio ponderado a Refinerías del Mercado Interno
- \(CrudoP\) = barriles de Crudo Procesado por las refinadoras
Consumidores
\[RC = (PI - PRMi - MR) * CrudoP \]
- \(RC\) = Renta apropiada por los Consumidores
- \(MR\) = Margen de Refinerías
Esto resulta equivalente a plantear:
\[RC = PCMi * CrudoP\]
- \(PCMi\) = Precio ponderado a Consumidores del Mercado Interno.
Renta Hidrocarburífera Total. En precios constantes, sobre Plusvalía Total y PBI
Existen dos caminos para llegar al monto total de renta de la tierra hidrocarburífera: uno es descontando la ganancia normal de las empresas a la plusvalía total del sector y el otro es por medio de la suma de mecanismos de apropiación.
\[Renta\_hidrocarburífera = PV_{hidrocarburífera} - Gcia\_Normal_{hidrocarburífera}\] Donde:
- \(Gcia\_Normal_{hidrocarburífera}\) = Ganancia Normal del sector hidrocarburífero
- \(PV_{hidrocarburífera}\) = Plusvalía del sector hidrocarburífero
\[Gcia\_Normal_{hidrocarburífera} = KTA_{hidrocarburífero} * TG_{referencia}\]
Donde:
- \(KTA_{hidrocarburos}\) = Stock de capital adelantado del sector hidrocarburífero
- \(TG_{referencia}\) = Tasa de ganancia normal de referencia.
En este caso, seleccionamos la tasa de ganancia del sector industrial como parámetro para diferenciar la renta de la ganancia. A su vez, para el capital total adelantado de las empresas hidrocarburíferas, seleccionamos unicamente el valor resultante de la estimación de la PPyE de Bolsar a partir del indice de flujo de pozos (variable “ppye_bolsar_flujo”), por lo que le faltan los inventarios y salarios adelantados.
El cálculo de renta total hidrocarburífera que se obtiene por medio de descontar la ganancia normal a la plusvalía total del sector, debe ser igual a la renta obtenida por medio de la agregación de los distintos mecanismos de apropiación. Es decir:
\[Renta\_hidrocarburífera = Renta\_diferencial\_precios + Renta\_sobrevaluación + Renta\_empresas + Impuestos\_netos\_específicos \] \[Impuestos\_netos\_específicos = Retenciones + Regalías - Subsidios\]
Método directo (a partir de descuentos sobre el VBP)
Joining, by = "anio"
Joining, by = "anio"

Método indirecto (suma de mecanismos)
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
`mutate_all()` ignored the following grouping variables:
Column `anio`
Use `mutate_at(df, vars(-group_cols()), myoperation)` to silence the message.
`mutate_all()` ignored the following grouping variables:
Column `anio`
Use `mutate_at(df, vars(-group_cols()), myoperation)` to silence the message.
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
Removed 21 rows containing missing values (position_stack).'big.mark' and 'decimal.mark' are both '.', which could be confusing
'big.mark' and 'decimal.mark' are both '.', which could be confusing

Costos
\[Q\_total = Q_{petróleo} + Q_{gas} \] Donde:
- \(Q\_total\) = Cantidades producidas de petróleo y gas en Barriles Equivalentes de Petróleo
- \(Q_{petróleo}\) = Cantidades producidas de petróleo crudo en barriles equivalentes de petróleo (BOE)
- \(Q_{gas}\) = Cantidades producidas de gas natural en barriles equivalentes de petróleo (BOE)
\[ Costos\_totales = CI + MS + ConKfijo\]
Donde:
- \(Costos\_totales\) = Costos totales hidrocarburíferos
- \(CI\) = Consumo Intermedio, distintas estimaciones
- \(MS\) = Masa Salarial, distintas estimaciones
- \(ConKfijo\) = Consumo de Capital Fijo
\[Costos\_totales\_con\_Gcia = Costos\_totales + Gcia\_Normal_{hidrocarburífera} \] Donde:
- \(Costos\_totales\_con\_Gcia\) = Costos totales hidrocarburíferos con ganancia normal
- \(Gcia\_Normal_{hidrocarburífera}\) = Ganancia normal del sector hidrocarburífero
\[ Precio\_costo = \frac{Costos\_totales}{Q\_total} \] Donde: * \(Precio\_costo\) = Precio de costo en BOE
A partir de esto se puede calcular un costo recuperable del petróleo y del gas
\[Costo\_crudo = Q_{petróleo} * Precio\_costo\] \[Costo\_gas = Q_{gas} * Precio\_costo\]
\[Precio\_produccion = \frac{Costos\_totales\_con\_Gcia}{Q\_total}\]
\[Precio\_vta\_potencial = \frac{Q\_total*Pext_{petróleo} - Costos\_totales}{Q\_total} \]
Donde: * \(Precio\_produccion\)= Precio de produccion * \(Precio_vta_potencial\) = Precio de venta potencial * \(Pext_{petróleo}\) = Precio de exportación/referencia internacional del petróleo crudo
Joining, by = "anio"
Joining, by = "anio"
Joining, by = c("anio", "ipc_18")
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
Joining, by = c("anio", "unidad")

Comparación con estimación de otros autores

'big.mark' and 'decimal.mark' are both '.', which could be confusing
Exportacion de resultados
LS0tDQp0aXRsZTogIlJlbnRhIGRlIGxhIHRpZXJyYSBoaWRyb2NhcmJ1csOtZmVyYSBlbiBBcmdlbnRpbmEgKDE5NjAgLSAyMDE4KSINCmF1dGhvcjoNCi0gYWZmaWxpYXRpb246IFVOR1MvQ09OSUNFVA0KICBuYW1lOiBNYXRlbyBTdXN0ZXIgeSBKdWFuIEtvcm5ibGlodHQNCm91dHB1dDoNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIGtlZXBfdGV4OiB5ZXMNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICB0b2M6IHllcw0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCi0tLQ0KDQo8YnI+DQo8YnI+DQoNCjxjZW50ZXI+IDxoMT48L2gxPiA8L2NlbnRlcj4gDQoNCg0KDQpgYGB7cn0NCiMgcGFyYSBndWFyZGFyIGdncGxvdCBjb24gdGFtYcOxbw0KIyBnZ3NhdmUoImZhY2V0X3dyYXBfY2hhcnQucG5nIiwgZmFjZXRfd3JhcF9jaGFydCwgd2lkdGggPSAxNjgwLzcyLCBoZWlnaHQgPSAxMDUwLzcyLCBkcGkgPSA3MikNCg0KYGBgDQoNCiAgDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyBsaWJyYXJ5KHh0YWJsZSkgIyBlaiB4dGFibGUodGFibGEpIHBhcmEgcGFzYXIgYSBsYXRleA0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSkNCg0KbGlicmFyeShyZWFkeGwpIA0KIyBsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoZnMpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoaHV4dGFibGUpICNyZXZpc2FyIGVzdG8gcGFyYSBkYXIgZm9ybWF0byBhbCBlamUgWQ0KIyBsaWJyYXJ5KFBlcmZvcm1hbmNlQW5hbHl0aWNzKQ0KbGlicmFyeShIbWlzYykNCmxpYnJhcnkoem9vKQ0KDQoNCg0Kb3B0aW9ucyhzY2lwZW4gPSA5OTk5OTk5KQ0KDQojIGFncmVnYXIgbGFiZWwgcGFyYSB2YXJpYWJsZXMgZGUgZ3JhZmljb3MgDQojZmFjZXR3cmFwKH4gZXhwZXJpbWVudG94LCBsYWJlbGxlciA9IGFzX2xhYmVsbGVyKGV4cF9uYW1lcykpKyAgDQoNCmBgYA0KDQojIEZ1bmNpb25lcyBkZSBjb252ZXJzacOzbiANCg0KKiBbQ2FuYWRhIOKAkyBOYXRpb25hbCBFbmVyZ3kgQm9hcmQuIEVuZXJneSBDb252ZXJzaW9uIFRhYmxlc10oaHR0cHM6Ly9hcHBzLmNlci1yZWMuZ2MuY2EvQ29udmVyc2lvbi9jb252ZXJzaW9uLXRhYmxlcy5hc3B4P0dvQ1RlbXBsYXRlQ3VsdHVyZT1lbi1DQSMyLTMpDQoqIFtCUF0oaHR0cHM6Ly93d3cuYnAuY29tL2NvbnRlbnQvZGFtL2JwL2J1c2luZXNzLXNpdGVzL2VuL2dsb2JhbC9jb3Jwb3JhdGUvcGRmcy9lbmVyZ3ktZWNvbm9taWNzL3N0YXRpc3RpY2FsLXJldmlldy9icC1zdGF0cy1yZXZpZXctMjAxOS1hcHByb3hpbWF0ZS1jb252ZXJzaW9uLWZhY3RvcnMucGRmKQ0KKiBbRUlBXShodHRwczovL3d3dy5laWEuZ292L2tpZHMvd2hhdC1pcy1lbmVyZ3kvZW5lcmd5LWNhbGN1bGF0b3JzLnBocCNuYXRnYXNjYWxjKQ0KDQoNCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgRnVuY2lvbmVzIGRlIGNvbnZlcnNpw7NuIHBhcmEgY3J1ZG8NCiMjIE1ldHJvIGN1YmljbyBhIGJhcnJpbCAoX3AgPSBwcmVjaW8sIF9xID0gY2FudGlkYWQpDQpjb252ZXJzb3JfbTNiYmxfcCA8LSBmdW5jdGlvbih4KSB7eCAvIDYuMjg5OH0NCmNvbnZlcnNvcl9tM2JibF9xIDwtIGZ1bmN0aW9uKHgpIHt4ICogNi4yODk4fQ0KDQojIEZ1bmNpb25lcyBkZSBjb252ZXJzacOzbiBwYXJhIGdhcw0KIyMgUGllcyBjw7piaWNvIGEgbWV0cm8gY8O6Ymljbw0KIyMgMWZ0wrM9IDAuMDI4MzE2ODVtwrMNCmNvbnZlcnNvcl9mdDNtM19wIDwtIGZ1bmN0aW9uKHgpIHt4IC8gMC4wMjgzMTY4NX0NCmNvbnZlcnNvcl9mdDNtM19xIDwtIGZ1bmN0aW9uKHgpIHt4ICogMC4wMjgzMTY4NX0NCg0KIyMgUGllIGPDumJpY28gYSBNaWxsw7NuIGRlIEJUVQ0KIyAxIGZ0MyA9ICAwLjAwMTAyOCBNTSBCVFUNCmNvbnZlcnNvcl9mdDNNTUJUVV9xIDwtIGZ1bmN0aW9uKHgpIHt4ICogMC4wMDEwMjh9DQpjb252ZXJzb3JfZnQzTU1CVFVfcCA8LSBmdW5jdGlvbih4KSB7eCAvIDAuMDAxMDI4fQ0KDQojIyBNaWxsw7NuIGRlIEJUVSBhIG1ldHJvIGPDumJpY28NCiMjIDEgTU0gQnR1ID0gIDI3LDggbTMgZGUgZ2FzIChJQVBHKSDDsyAyOC4zMjg2MSBtMyAoQ2FuYWRhIEVuZXJneSBSZWd1bGF0b3IpICANCmNvbnZlcnNvcl9NTUJUVW0zZ2FzX3AgPC0gZnVuY3Rpb24oeCkge3ggLyAyOC4zMjg2MX0NCiAgDQojIyBtMyBhICBNTUJUVSBkZSBnYXMNCiMgMSBtMyA9IDAuMDM1MyBNTSBCVFUgIChDYW5hZGEgRW5lcmd5IFJlZ3VsYXRvcikNCiMgb3RyYSBvcGNpw7NuIDEgbTMgPSAzNC4xMjEgTU0gQlRVICAoQlApDQpjb252ZXJzb3JfbTNNTUJUVV9xIDwtIGZ1bmN0aW9uKHgpe3ggKiAwLjAzNTN9DQpjb252ZXJzb3JfbTNNTUJUVV9wIDwtIGZ1bmN0aW9uKHgpe3ggLyAwLjAzNTN9DQoNCiMjIG0zIGEgIE1NQlRVIChBbHRlcm5hdGl2YSwgcmV2aXNhcikNCiMgY29udmVyc29yX20zTU1CVFVfcSA8LSBmdW5jdGlvbih4KXt4ICogMS8yNy44fQ0KIyBjb252ZXJzb3JfbTNNTUJUVV9wIDwtIGZ1bmN0aW9uKHgpe3ggLyAxLzI3Ljh9DQoNCiMjIENvbnZlcnNpw7NuIGEgQkVQIGRlc2RlIGRpc3RpbnRhcyBtZWRpZGFzDQpjb252ZXJzb3JfbTNiZXBfcSA8LSBmdW5jdGlvbih4KSB7eCAqIDU4ODN9DQpjb252ZXJzb3JfTU1CVFViZXBfcSA8LSBmdW5jdGlvbih4KSB7eCAqIDAuMTcyNDU0OTZ9ICMgQlANCmNvbnZlcnNvcl9NTUJUVWJlcF9wIDwtIGZ1bmN0aW9uKHgpIHt4IC8gMC4xNzI0NTQ5Nn0NCmNvbnZlcnNvcl9iZXBNTUJUVV9wIDwtIGZ1bmN0aW9uKHgpIHt4IC8gNS43OTg2MTV9DQpgYGANCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyBPdHJhcyBmdW5jaW9uZXMNCmNhbWJpb19wb3JjZW50dWFsIDwtIGZ1bmN0aW9uKHgpIHt4L2xhZyh4KSAtIDF9DQoNCmdlbmVyYXJfaW5kaWNlIDwtICBmdW5jdGlvbihzZXJpZSxmZWNoYSwgZmVjaGFfYmFzZSl7DQogIHZhbG9yX2Jhc2UgPC0gc2VyaWVbd2hpY2goZmVjaGE9PWZlY2hhX2Jhc2UpXQ0KICBpZl9lbHNlKHNlcmllID09IDAsIDAsIHNlcmllL3ZhbG9yX2Jhc2UpDQp9DQoNCg0KDQp2YXJpYWNpb25faW50ZXJhbnVhbCA8LSBmdW5jdGlvbih4KSB7eCAgLSBsYWcoeCl9DQoNCnRhc2FfY3JlY2ltaWVudG8gPC0gZnVuY3Rpb24oeCkgeyh4ICAtIGxhZyh4KSkvbGFnKHgpfQ0KDQoNCmdlbmVyYXJfaW5kaWNlIDwtICBmdW5jdGlvbihzZXJpZSxmZWNoYSwgZmVjaGFfYmFzZSl7DQogIHZhbG9yX2Jhc2UgPC0gc2VyaWVbd2hpY2goZmVjaGE9PWZlY2hhX2Jhc2UpXQ0KICAoc2VyaWUvdmFsb3JfYmFzZSkNCn0NCg0KDQoNCiMgVGFibGEgcGFyYSBjb252ZXJ0aXIgbG9zIGNhbWJpb3MgZGUgbW9uZWRhDQpjb252ZXJzb3JfcGVzb3MgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9wYXNlIGRlIG1vbmVkYS54bHN4IikgJT4lIA0KICAjIG11dGF0ZSgibSRuIiA9IGFzLmRvdWJsZShjb252ZXJzb3JfcGVzb3MkYG0kbmApKSAlPiUgDQogIG11dGF0ZV9hbGwoLiwgYXMuZG91YmxlKSAlPiUgDQogIG11dGF0ZShtb25lZGEgPSBjKCJtb25lZGEgbmFjaW9uYWwiLCAicGVzb3MgbGV5IiwgInBlc28gYXJnZW50aW5vIiwgImF1c3RyYWwiLCAicGVzb3MiKSkgJT4lIA0KICBmaWx0ZXIobW9uZWRhID09ICJwZXNvcyIpDQoNCmBgYA0KDQoNCg0KDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCg0KIyBEYXRvcyBhdXhpbGlhcmVzDQojI1JldmlzdGEgZGUgUG9sw610aWNhIGRlIFByZWNpb3MgZGUgbGEgRW5lcmfDrWENCiMjIEdBUw0KI3ByZWNpbyB0cmFuc2ZlcmVuY2lhLCByZWdhbGlhcywgY29tcGVuc2FjaW9uZXMsIGV0YyBhIG5vdmllbWJyZSBkZSBjYWRhIGHDsW8NCmN1YWRyb180LjEgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZXZpc3RhcyBQb2zDrXRpY2FzIGRlIFByZWNpb3MgZGUgbGEgRW5lcmdpYSBlbiBBcmcgMTk3MC0xOTg4L1ByZWNpb3MgZGVsIGdhcyBuYXR1cmFsIHkgZGVyaXZhZG9zIDE5NzAgLSAxOTg4Lnhsc3giLCANCiAgICBza2lwID0gMSwgc2hlZXQgPSAxKQ0KDQojcHJlY2lvIGJvbGl2aWEgdnMgcHJlY2lvcyBpbnRlcm5vcw0KY3VhZHJvXzQuMyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JldmlzdGFzIFBvbMOtdGljYXMgZGUgUHJlY2lvcyBkZSBsYSBFbmVyZ2lhIGVuIEFyZyAxOTcwLTE5ODgvUHJlY2lvcyBkZWwgZ2FzIG5hdHVyYWwgeSBkZXJpdmFkb3MgMTk3MCAtIDE5ODgueGxzeCIsIA0KICAgIHNraXAgPSAxLCBzaGVldCA9IDMpICU+JQ0KICByZW5hbWUodW5pZGFkX2dhcyA9ICJ1bmlkYWQgZ2FzIikgJT4lIA0KICBtdXRhdGUodW5pZGFkX2dhcyA9ICJwZXNvcyBkZSAxOTcwLzEwMDAgbTMiICkNCg0KI3ByZWNpbyBhZHF1aXNpY2nDs24gZGVsIEVzdGFkbyB5IHRhcmlmYSBtZWRpYSBkZSBnYXMgZGlzdHJpYnVpZG8NCmN1YWRyb180LjQgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZXZpc3RhcyBQb2zDrXRpY2FzIGRlIFByZWNpb3MgZGUgbGEgRW5lcmdpYSBlbiBBcmcgMTk3MC0xOTg4L1ByZWNpb3MgZGVsIGdhcyBuYXR1cmFsIHkgZGVyaXZhZG9zIDE5NzAgLSAxOTg4Lnhsc3giLCANCiAgICBza2lwID0gMSwgc2hlZXQgPSA0KQ0KYGBgDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMjIENSVURPDQoNCiMgUHJlY2lvcyBwb3IgY3VlbmNhDQpjdWFkcm9fMi4yIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmV2aXN0YXMgUG9sw610aWNhcyBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnaWEgZW4gQXJnIDE5NzAtMTk4OC9QcmVjaW9zIGRlbCBwZXRyb2xlbyBjcnVkbyB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OS54bHN4IiwgDQogICAgc2tpcCA9IDAsIHNoZWV0ID0gMikgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gInBlc29zIGRlIDE5NzAiKQ0KDQojZXZvbHVjacOzbiBkZSBwcmVjaW9zIHBvciBjdWVuY2lhIChpbmRpY2VzIDE5NzAgPSAxMDApDQpjdWFkcm9fMi4zIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmV2aXN0YXMgUG9sw610aWNhcyBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnaWEgZW4gQXJnIDE5NzAtMTk4OC9QcmVjaW9zIGRlbCBwZXRyb2xlbyBjcnVkbyB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OS54bHN4IiwgDQogICAgc2tpcCA9IDAsIHNoZWV0ID0gMykgJT4lIA0KICByZW5hbWUoYW5pbyA9ICIuLi4xIikNCg0KDQojIHByZWNpbyBwcm9tZWRpbyBwYWdhZG8gYSBjb250cmF0aXN0YXMgZW4gcGVzb3MgeSBkb2xhcmVzDQpjdWFkcm9fMi41IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmV2aXN0YXMgUG9sw610aWNhcyBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnaWEgZW4gQXJnIDE5NzAtMTk4OC9QcmVjaW9zIGRlbCBwZXRyb2xlbyBjcnVkbyB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OS54bHN4IiwgDQogICAgc2tpcCA9IDEsIHNoZWV0ID0gNSkNCg0KIyBwcmVjaW9zIHBhZ2Fkb3MgYSBjb250cmF0aXN0YXMgdnMgY29icmFkb3MgcG9yIHJlZmluYWRvcmFzIHByaXZhZGFzIChwcmVjaW8gY3J1ZG8gbmV1cXVpbmEpDQpjdWFkcm9fMi42IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmV2aXN0YXMgUG9sw610aWNhcyBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnaWEgZW4gQXJnIDE5NzAtMTk4OC9QcmVjaW9zIGRlbCBwZXRyb2xlbyBjcnVkbyB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OS54bHN4IiwgDQogICAgc2tpcCA9IDEsIHNoZWV0ID0gNikgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gInBlc29zX2RlXzE5NzBfbTMiKQ0KDQojIHZhbG9yZXMgdW5pdGFyaW9zIGRlbCBwcm9kdWN0byBjb21wdWVzdG8gYSBuaXZlbCBwcm9kdWN0b3JlcyB5IGNvbnN1bWlkb3Jlcw0KY3VhZHJvXzIuNyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JldmlzdGFzIFBvbMOtdGljYXMgZGUgUHJlY2lvcyBkZSBsYSBFbmVyZ2lhIGVuIEFyZyAxOTcwLTE5ODgvUHJlY2lvcyBkZWwgcGV0cm9sZW8gY3J1ZG8geSBkZXJpdmFkb3MgMTk3MCAtIDE5ODkueGxzeCIsIA0KICAgIHNraXAgPSAxLCBzaGVldCA9IDcpDQoNCmBgYA0KIA0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIyMgVENQIA0KdGNwX2FudWFsIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL1RDUC90Y3BfYW51YWwueGxzeCIsIA0KICAgIGNvbF90eXBlcyA9IGMoIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIikpICU+JSANCiAgcmVuYW1lKGFuaW8gPSBmZWNoYSkNCg0KdGNwX2FudWFsX2IgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvVENQL3RjY190Y3BfaGlzdG9yaWNvLnhsc3giKSAlPiUgDQogIHJlbmFtZSh0Y2MgPSAgYFRDQyBleHBvcnRhY2lvbmVzYCwgc29icmV2YWx1YWNpb24gPSBgU29icmV2YWx1YWNpw7NuIChUQ1AvIFRDQykgMTk1Mi0xOTcyPTFgLA0KICAgICAgICAgdGNwID0gIlRDUCIpICU+JSANCiAgbXV0YXRlKGFuaW8gPSBjYXNlX3doZW4oYW5pbyA9PSA0MzMxMyB+IDIwMTgsDQogICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBhbmlvKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdGNjLCB0Y3AsIHNvYnJldmFsdWFjaW9uKQ0KDQojIHRjXzM1MDAgPC0gcmVhZF9leGNlbCgiL0FyY2hpdm9zL0RhdG9zL1RDUC9jb20zNTAwLnhscyIsIHNraXAgPSAzLCBzaGVldCA9IDEpICU+JSANCiMgICBzZWxlY3QoLSIuLi4zIikgJT4lIA0KIyAgIG11dGF0ZShhbmlvID0geWVhcihGZWNoYSkpICU+JSANCiMgICBncm91cF9ieShhbmlvKSAlPiUgDQojICAgc3VtbWFyaXNlKHRjY19hdmcgPSBtZWFuKGBUaXBvIGRlIENhbWJpbyBkZSBSZWZlcmVuY2lhIC0gZW4gUGVzb3MgLSBwb3IgRMOzbGFyYCkpDQojIHdyaXRlLmNzdih0Y18zNTAwLCAicmVzdWx0YWRvcy9hdXhpbGlhcmVzL3RjXzM1MDAuY3N2IikNCg0KdGNjX2RpY182MyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9UQ1AvdGNjX2RpY182My54bHN4IikNCg0KdGNjX21vbmVkYV9vcmlnaW5hbCA8LSAgdGNjX2RpY182MyAlPiUgDQogIHNlbGVjdCgtdXNkX2RpYykgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsX2IgJT4lIHNlbGVjdChhbmlvLCB0Y2MgKSkgJT4lIA0KICBtdXRhdGUobW9uZWRhID0gY2FzZV93aGVuKGFuaW8gPT0gMTk4NCB+ICIkYXJnIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gbW9uZWRhKSwNCiAgICAgICAgICB0Y2NfbW9uZWRhID0gY2FzZV93aGVuKCAjaG9tb2dlbml6YW1vcyBsb3MgY2FtYmlvcyBkZSBtb25lZGENCiAgICAgICAgICAgICAgICAgbW9uZWRhID09ICJtJG4iIH4gdGNjKmNvbnZlcnNvcl9wZXNvcyRgbSRuYCAsDQogICAgICAgICAgICAgICAgIG1vbmVkYSA9PSAiJGxleSIgfiB0Y2MqY29udmVyc29yX3Blc29zJGAkTGV5YCwgDQogICAgICAgICAgICAgICAgIG1vbmVkYSA9PSAiJGFyZyIgfiB0Y2MqY29udmVyc29yX3Blc29zJGAkYWAsIA0KICAgICAgICAgICAgICAgICBtb25lZGEgPT0gIkEiIH4gdGNjKmNvbnZlcnNvcl9wZXNvcyRBLA0KICAgICAgICAgICAgICAgICBUIH4gdGNjKSApDQp0Y2NfbW9uZWRhX29yaWdpbmFsICANCmBgYA0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIyBJUEMNCmlwYyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9pbmRpY2VzL2lwY19tZW5zdWFsXzE5NjNfMjAxOC54bHN4IikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IHpvbzo6bmEubG9jZihhbmlvKSkgJT4lIA0KICByZW5hbWUoaXBjXzA3MDMgPSBgQmFzZSA3LzIwMDMgPSAxYCkgJT4lIA0KICBtdXRhdGUoZmVjaGEgPSBhcy5EYXRlKHBhcnNlX2RhdGVfdGltZShwYXN0ZShhbmlvLCBtZXMsIHNlcCA9ICItIiksIG9yZGVycyA9ICJ5bSIpKSkgJT4lIA0KICBzZWxlY3QoZmVjaGEsIGFuaW8sIG1lcyAsIGV2ZXJ5dGhpbmcoLikpDQoNCiNlc3RlIGVzdMOhIG1hbCAgDQojIGlwY192YXJpYWNpb24gPC0gIGlwYyAgJT4lIA0KIyAgIGZpbHRlcihtZXMgPT0gMSkgJT4lIA0KIyAgIG11dGF0ZShpcGNfdmFyID0gY2FtYmlvX3BvcmNlbnR1YWwoaXBjXzA3MDMpLA0KIyAgICAgICAgICBpcGNfdmFyPSBjYXNlX3doZW4oaXMubmEoaXBjX3ZhcikgfiAxLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IGlwY192YXIpLA0KIyAgICAgICAgICAgaXBjXzAxNjIgPSBjYXNlX3doZW4oYW5pbyA9PSAxOTYyIH4gMSksDQojICAgICAgICAgIGlwY18wMTYyID0gbGFnKGlwY18wMTYyKStsYWcoaXBjXzAxNjIpKiBpcGNfdmFyKQ0KIyAgICAgICAgICANCiAgICAgICAgICMgaXBjXzAxNjIgPSBsYWcoaXBjXzAxNjIpICsgKGxhZyhpcGNfMDE2MikqIGlwY192YXIpKQ0KICAgICAgICAgIyBpcGNfMDE2MiA9IGNhc2Vfd2hlbiggaXMubmEoaXBjXzAxNjIpIH4gbGFnKGlwY18wMTYyKSArIGxhZyhpcGNfMDE2MikqaXBjX3ZhciApKQ0KDQoNCmlwY19wcm9tZWRpbyA8LSBpcGMgJT4lDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKGlwY18wMyA9IG1lYW4oaXBjXzA3MDMpKSAlPiUgDQogIG11dGF0ZShmZWNoYSA9IGFzLkRhdGUocGFyc2VfZGF0ZV90aW1lKGFuaW8gLCBvcmRlcnMgPSAieSIpKSwgDQogICAgICAgICBpcGNfNzAgPSBnZW5lcmFyX2luZGljZShzZXJpZSA9IGlwY18wMywgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhPSBmZWNoYSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGFfYmFzZSA9ICIxOTcwLTAxLTAxIiksDQogICAgICAgICBpcGNfMTggPSBnZW5lcmFyX2luZGljZShzZXJpZSA9IGlwY18wMywgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhPSBmZWNoYSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGFfYmFzZSA9ICIyMDE4LTAxLTAxIikpICU+JSANCiAgc2VsZWN0KGZlY2hhLCBldmVyeXRoaW5nKC4pKQ0KDQp3cml0ZS5jc3YoaXBjX3Byb21lZGlvLCBmaWxlID0gIkM6L0FyY2hpdm9zL0RhdG9zL2luZGljZXMvaXBjX3Byb21lZGlvLmNzdiIpDQoNCiMgaXBjXzcwIDwtIGlwY192YXJpYWNpb24gJT4lIA0KIyAgIHNlbGVjdChmZWNoYSwgaXBjXzAxNzApICU+JSANCiMgICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSANCiMgICAgICAgICAgICAgICBzZWxlY3QoZmVjaGEsIGlwY183MCkpDQoNCiMgSVBJTSBiYXNlIDE5OTMgPSAxMDANCiMgw41uZGljZSBkZSBwcmVjaW9zIGludGVybm9zIGFsIHBvciBtYXlvciAoSVBJTSkNCiMgw41uZGljZSBkZSBwcmVjaW9zIGludGVybm9zIGLDoXNpY29zIGFsIHBvciBtYXlvciAoSVBJQikNCiMgw41uZGljZSBkZSBwcmVjaW9zIGLDoXNpY29zIGRlbCBwcm9kdWN0b3IgKElQUCkNCnNpcG1fc2VyaWU1Nl85NSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9JTkRFQy9JUElNL3NpcG0tc2VyaWU1Ni05NS54bHMiLA0KICAgIHNraXAgPSA2KSAlPiUgDQogIHJlbmFtZShhbmlvID0gbWVzLA0KICAgICAgICAgaXBpbV9uaXZlbF9ncmFsID0gZ2VuZXJhbC4uLjIgLA0KICAgICAgICAgaXBpbV9uaXZlbF9uYWMgPSBuYWNpb25hbGVzLi4uMywNCiAgICAgICAgIGlwaW1fbml2ZWxfaW1wbyA9IEltcG9ydGFkb3MsDQogICAgICAgICBpcGliX25pdmVsX2dyYWwgPSBnZW5lcmFsLi4uNSAsDQogICAgICAgICBpcGliX25pdmVsX25hYyA9IG5hY2lvbmFsZXMuLi42LA0KICAgICAgICAgaXBpYl9uaXZlbF9pbXBvID0gaW1wb3J0YWRvcywNCiAgICAgICAgIGlwcF9uaXZlbF9ncmFsID0gZ2VuZXJhbC4uLjgpICU+JSANCiAgZmlsdGVyKGdyZXBsKCAiMTkiLCBhbmlvKSkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IGFzLmRvdWJsZShhbmlvKSkNCg0KaXBpbV9iYXNlOTQgPC0gc2lwbV9zZXJpZTU2Xzk1ICU+JSBtdXRhdGUoaXBpbV9uaXZlbF9ncmFsXzk0ID0gZ2VuZXJhcl9pbmRpY2UoaXBpbV9uaXZlbF9ncmFsLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhID0gYW5pbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhX2Jhc2UgPSAxOTk0KSkgJT4lIA0KICBzZWxlY3QoYW5pbywgaXBpbV9uaXZlbF9ncmFsLCBpcGltX25pdmVsX2dyYWxfOTQpDQoNCiMgR2FuYW5jaWEgeSBwYmkgcGVzb3MgY29ycmllbnRlcyAoZnVlbnRlOiBKSUMvRU0gY29udGludWFjaW9uIEpJQykNCmdhbmFuY2lhX3lfcGJpIDwtIHJlYWRfZXhjZWwoIi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL2RhdGFzZXRzL2dhbmFuY2lhIHkgcGJpLnhsc3giKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgY29ycmllbnRlcyIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSkNCg0KYGBgDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMgRXN0aW1hY2lvbiBkZSBvdHJvcyBhdXRvcmVzDQojICoqRXN0aW1hY2nDs24gSksqKg0KcmVudGFfaGlkcm9jYXJidXJvc19qayA8LSByZWFkX2V4Y2VsKCIvQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9yZW50YV9oaWRyb2NhcmJ1cm9zX2prLnhscyIsIA0KICAgIHNraXAgPSAyKSAlPiUgDQogIGZpbHRlcihpbmRpY2VfdGllbXBvIDw9IDIwMTkpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpICU+JSANCiAgcmVuYW1lKHByZWNpb19tZV9nYXMgPSBgR2FzIG5hdHVyYWwgbWVyY2FkbyBleHRlcm5vYCwNCiAgICAgICAgIHByZWNpb19taV9nYXMgPSBgcHJlY2lvIGludGVybm8gZ2FzIG5hdHVyYWxfcGVzb3NgLA0KICAgICAgICAgcHJlY2lvX21lX2NydWRvID0gYFByZWNpbyBjcnVkbyBtZXJjYWRvIGV4dGVybm9gLA0KICAgICAgICAgcHJlY2lvX21pX2NydWRvID0gYFByZWNpbyBjcnVkbyBtZXJjYWRvIGludGVybm9gLA0KICAgICAgICAgcHJlY2lvX2JvbGl2aWFfZ2FzX3VzZCA9IGBHYXMgTmF0dXJhbC4gUHJlY2lvIFZlbnRhIEJvbGl2aWEgYSBBcmdlbnRpbmEuLi4yNGAsIA0KICAgICAgICAgcHJlY2lvX2JvbGl2aWFfZ2FzX3Blc29zID0gYEdhcyBOYXR1cmFsLiBQcmVjaW8gVmVudGEgQm9saXZpYSBhIEFyZ2VudGluYS4uLjI1YCwNCiAgICAgICAgIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb19jcnVkbyA9YFJlbnRhIHBvciB2ZW50YSBjcnVkbyBlbiBlbCBtZXJjYWRvIGludGVybm8gcG9yIGRlYmFqbyAvIGFycmliYSBwcmVjaW8gaW50ZXJuYWNpb25hbGAsDQogICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9fZ2FzID0gJ1JlbnRhIHBvciB2ZW50YSBnYXMgZW4gZWwgbWVyY2FkbyBpbnRlcm5vIHBvciBkZWJham8gLyBhcnJpYmEgcHJlY2lvIGludGVybmFjaW9uYWwnLA0KICAgICAgICAgcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8gPSAnUmVudGEgY3J1ZG8gcG9yIGV4cG9ydGFjaW9uZXMgYSBwZXNvIHNvYnJldmFsdWFkbycsDQogICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9nYXMgPSAnUmVudGEgZ2FzIHBvciBleHBvcnRhY2lvbmVzJywNCiAgICAgICAgIHJldGVuY2lvbmVzID0gIlJldGVuY2lvbmVzIiwNCiAgICAgICAgIHJlZ2FsaWFzID0gYFJlZ2FsaWFzIHRvdGFsYCwNCiAgICAgICAgIHJlbnRhX3RvdGFsID0gJ1NVTUEgcmVudGEgb3Ryb3MgKHNpbiBpbXBvcnRhY2lvbmVzIG5pIHJldGVuY2lvbmVzKScpICU+JSANCiAgbXV0YXRlKHVuaWRhZF9nYXMgPSAiTU1CVFUiLA0KICAgICAgICAgdW5pZGFkX2NydWRvID0gIkJhcnJpbGVzIiwNCiAgICAgICAgIHVuaWRhZF9yZW50YSA9ICJQZXNvcyBjb3JyaWVudGVzIikgJT4lIA0KICBzZWxlY3QoYW5pbyA9IGluZGljZV90aWVtcG8sIHVuaWRhZF9nYXMsIHVuaWRhZF9jcnVkbywgdW5pZGFkX3JlbnRhLA0KICAgICAgICAgcHJvZF9wZXRjcnUsIGV4cG9fY3J1ZG8sIGNydWRvX2ludGVybm8sDQogICAgICAgICBwcm9kX2dhc25hdCwgZXhwb19nYXMsIGdhc19pbnRlcm5vLA0KICAgICAgICAgcHJlY2lvX21lX2dhcyAsIHByZWNpb19taV9nYXMgLCBwcmVjaW9fbWVfY3J1ZG8sIHByZWNpb19taV9jcnVkbywgDQogICAgICAgICBwcmVjaW9fYm9saXZpYV9nYXNfdXNkICwgIHByZWNpb19ib2xpdmlhX2dhc19wZXNvcyAsIA0KICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvX2NydWRvICwgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvX2dhcyAsDQogICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkbyAsIHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcyAsDQogICAgICAgICByZXRlbmNpb25lcywgcmVnYWxpYXMsIA0KICAgICAgICAgVENDLCBUQ1AsIA0KICAgICAgICAgcmVudGFfdG90YWwpICU+JQ0KICBtdXRhdGVfYXQoLnZhcnMgPSBjKCJwcm9kX3BldGNydSIsICJleHBvX2NydWRvIiwgImNydWRvX2ludGVybm8iKSwgDQogICAgICAgICAgICAuZnVucyA9IGNvbnZlcnNvcl9tM2JibF9xKSAlPiUgDQogIG11dGF0ZV9hdCgudmFycyA9IGMoInByZWNpb19taV9jcnVkbyIsICJwcmVjaW9fbWVfY3J1ZG8iKSwNCiAgICAgICAgICAgIC5mdW5zID0gY29udmVyc29yX20zYmJsX3ApICU+JSANCiAgbXV0YXRlX2F0KC52YXJzID0gYygicHJvZF9nYXNuYXQiLCAiZXhwb19nYXMiLCAiZ2FzX2ludGVybm8iKSwNCiAgICAgICAgICAgIC5mdW5zID0gY29udmVyc29yX20zTU1CVFVfcSkgJT4lIA0KICBtdXRhdGVfYXQoLnZhcnMgPSBjKCJwcmVjaW9fbWlfZ2FzIiwgInByZWNpb19ib2xpdmlhX2dhc19wZXNvcyIpLA0KICAgICAgICAgICAgLmZ1bnMgPSBjb252ZXJzb3JfbTNNTUJUVV9wKQ0KDQogIA0KcmVudGFfcHJlY2lvX2V4cG9fY3J1ZG9famsgPC0gcmVudGFfaGlkcm9jYXJidXJvc19qayAlPiUgDQogIHNlbGVjdChhbmlvLCBwcm9kX3BldGNydSwgZXhwb19jcnVkbywgY3J1ZG9faW50ZXJubywgDQogICAgICAgICBwcmVjaW9fbWlfY3J1ZG8sIHByZWNpb19tZV9jcnVkbywgVENDLCBUQ1AsIA0KICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvX2NydWRvLCByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkbyApDQoNCg0KcmVudGFfcHJlY2lvX2V4cG9fZ2FzX2prIDwtIHJlbnRhX2hpZHJvY2FyYnVyb3NfamsgJT4lIA0KICBzZWxlY3QoYW5pbywgcHJvZF9nYXNuYXQsIGV4cG9fZ2FzLCBnYXNfaW50ZXJubywgDQogICAgICAgICBwcmVjaW9fbWlfZ2FzLCBwcmVjaW9fYm9saXZpYV9nYXNfcGVzb3MsIFRDQywgVENQLCANCiAgICAgICAgIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb19nYXMsIHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcyApDQoNCg0KI0VzdGltYWNpw7NuIEJpbGwgeSBGYXJmYXJvIFJ1aXoNCnJlbnRhX2hpZHJvY2FyYnVyb3NfZnIgPC0gcmVhZF9leGNlbCgiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvcmVudGFfaGlkcm9jYXJidXJvc19GUi54bHN4IiApICU+JQ0KICBzZWxlY3QoLXVuaWRhZCkgJT4lIA0KICByZW5hbWUocmVnYWxpYXMgPSAiUmVnYWzDrWFzIiwNCiAgICAgICAgIHJldGVuY2lvbmVzID0gUmV0ZW5jaW9uZXMsDQogICAgICAgICBleHBvX3RjID0gIk1lZGlhbnRlIHNvYnJldmFsdWFjacOzbiBwYXJhIGV4cG9ydCIsDQogICAgICAgICBkaWZfcHJlY2lvcyA9ICJNZWRpYW50ZSBkaWZlcmVuY2lhIHByZWNpbyBpbnRlcm5vIGNvbiBpbnRlcm5hYyIpICU+JQ0KICBncm91cF9ieShhbmlvICwgaXBjXzA4KSAlPiUgDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkge3ggLyAxMF4zfSkgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lDQogIG11dGF0ZShyZWdhbGlhcyA9cmVnYWxpYXMgKiBpcGNfMDggL2lwY18xOCwNCiAgICAgICAgIHJldGVuY2lvbmVzID1yZXRlbmNpb25lcyAqIGlwY18wOCAvaXBjXzE4LA0KICAgICAgICAgZXhwb190YyA9ZXhwb190YyAqIGlwY18wOCAvaXBjXzE4LA0KICAgICAgICAgZGlmX3ByZWNpb3MgPWRpZl9wcmVjaW9zICogaXBjXzA4IC9pcGNfMTgsDQogICAgICAgICByZW50YV90b3RhbCA9IHJlZ2FsaWFzKyByZXRlbmNpb25lcysgZXhwb190YysgZGlmX3ByZWNpb3MsDQogICAgICAgICB1bmlkYWQgPSAibWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgc2VsZWN0KC1pcGNfMDgpIA0KcmVudGFfaGlkcm9jYXJidXJvc19mcg0KDQojb3Ryb3MgYXV0b3Jlcw0KcmVudGFfYXV0b3JlcyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIGNhbGN1bG8gcmVudGEgb3Ryb3MvcmVudGFfYXV0b3Jlcy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpDQoNCg0KYGBgDQoNCg0KIyBWYXJpYWJsZXMNCg0KIyMgUHJvZHVjY2nDs24NCg0KRnVlbnRlczogDQoNCiogW01pbmlzdGVyaW8gZGUgSGFjaWVuZGEsIEluZm9ybWVzDQpTZWN0b3JpYWxlc10oaHR0cHM6Ly93d3cuYXJnZW50aW5hLmdvYi5hci9lY29ub21pYS9wb2xpdGljYWVjb25vbWljYS9yZWdpb25hbHlzZWN0b3JpYWwvaW5mb3JtZXNwcm9kdWN0aXZvcykgKDE5OTgtaG95KS4gDQoqIFtTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSAtIFJlZ2FsaWFzXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvcmVnYWxpYXMtZGUtcGV0cm9sZW8tY3J1ZG8tZ2FzLW5hdHVyYWwtZ2xwLWdhc29saW5hLXktY29uZGVuc2FkbykgKDE5OTgtaG95KQ0KKiBbU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgLSBTRVNDTyBEb3duc3RyZWFtXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvcHJvZHVjY2lvbi1kZS1wZXRyb2xlby15LWdhcy10YWJsYXMtZGluYW1pY2FzKSgxOTkzLWhveSkNCiogW0FudWFyaW8gZGUgY29tYnVzdGlibGVzXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvYW51YXJpb3MtZGUtY29tYnVzdGlibGVzLTE5NTAtMTk5OSkgKDE5MTEtMTk5MikNCiogS296dWxqIHkgUGlzdG9uZXNpLiBSZXZpc3RhICBkZWwgSW5zdGl0dXRvIGRlIEVjb25vbcOtYSBFbmVyZ8OpdGljYSAoSURFRSkgLSBGdW5kYWNpw7NuIEJhcmlsb2NoZSAgKDE5NzAgLSAxOTg4KQ0KKiBbRUlBXShodHRwczovL3d3dy5laWEuZ292L2ludGVybmF0aW9uYWwvZGF0YS9jb3VudHJ5L0FSRy9wZXRyb2xldW0tYW5kLW90aGVyLWxpcXVpZHMvYW5udWFsLXBldHJvbGV1bS1hbmQtb3RoZXItbGlxdWlkcy1wcm9kdWN0aW9uP3BkPTUmcD0wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwdmcmdT0wJmY9QSZ2PW1hcGJ1YmJsZSZhPS0maT1ub25lJnZvPXZhbHVlJiZ0PUMmZz1ub25lJmw9MjQ5LS02JnM9OTQ2OTQ0MDAwMDAmZT0xNTQ2MzAwODAwMDAwKSAoMTk4MCAtIDIwMTkpDQoNCiMjIyBQcm9kdWNjacOzbiBkZSBDcnVkbw0KDQoNCkxhIHByb2R1Y2Npw7NuIGRlIHBldHLDs2xlbyBjcnVkbyBkZSBsYXJnbyBwbGF6byBwcm92aWVuZSBkZWwgQW51YXJpbyBkZSBDb21idXN0aWJsZXMsIGRlIGxhIGN1YWwgY29udGFtb3MgZGF0b3MgZGVzZGUgMTkxMSBoYXN0YSAxOTkyLiBTdXMgdmFsb3JlcyBwYXJhIGVsIHBlcsOtb2RvIDE5ODAtMTk5MiBjb2luY2lkZW4gY29uIGxvcyBkZSBFSUEsIHBvciBsbyBjdWFsIHB1ZWRlbiB1c2Fyc2UgY29tbyBmdWVudGVzIGFsdGVybmF0aXZhcy4gQXNpbWlzbW8sIGxhIGV2b2x1Y2nDs24gZGUgU0VTQ08gZXMgc2ltaWxhciBhIGxhIGRlIEVJQSwgc2Fsdm8gcG9yIHBlcXVlw7FhcyBkaXZlcmdlbmNpYXMgZW50cmUgMjAwOCB5IDIwMTMuIExhIHNlcmllIGRlIFJlZ2Fsw61hcyBwcmVzZW50YSB1biBuaXZlbCBtZW5vciBxdWUgbGFzIGFudGVyaW9yZXMgZGViaWRvIGEgbGFzIGRlZHVjY2lvbmVzIGRlIHByb2R1Y2Npw7NuIHF1ZSByZWFsaXphbiBsYXMgZW1wcmVzYXMgcGFyYSBwYWdhciB1biBtZW5vciBuaXZlbCBkZSBSZWdhbMOtYXMgaGFjaWEgbGFzIHByb3ZpbmNpYXMgZG9uZGUgcmVhbGl6YW4gbGEgcHJvZHVjY2nDs24uIFBvciDDumx0aW1vLCBsYSBzZXJpZSBkZWwgTWluaXN0ZXJpbyBkZSBFY29ub23DrWEgY29pbmNpZGUgY29uIFJlZ2Fsw61hcyBlbiBzdXMgcHJpbWVyb3MgYcOxb3MsIGx1ZWdvIHByZXNlbnRhIHVuIG5pdmVsIGludGVybWVkaW8gZW50cmUgUmVnYWzDrWFzIHkgU0VTQ08geSBhIHBhcnRpciBkZSAyMDA5IHRvbWEgYSBTRVNDTyBjb21vIGZ1ZW50ZS4gU2Fsdm8gZWwgQW51YXJpbyBkZSBDb21idXN0aWJsZXMsIGVsIHJlc3RvIGRlIGxhcyBzZXJpZXMgcHJlc2VudGFuIGRhdG9zIGhhc3RhIGxvcyDDumx0aW1vcyBhw7Fvcy4gUG9yIGxvIHRhbnRvLCBlbCBjcml0ZXJpbyBkZSBzZWxlY2Npw7NuIHBhcmEgbGEgc2VyaWUgZGUgcHJvZHVjY2nDs24gY29uIGxhIHF1ZSBzZSByZWFsaXphcsOhbiBsb3MgY8OhbGN1bG9zIGVzIGVsIHNpZ3VpZW50ZToNCg0KKiBDcml0ZXJpbyBkZSBjw7NtcHV0byBwYXJhIHByb2R1Y2ljw7NuIGRlIGNydWRvOiANCiAgKyAxOTExIGEgMTk5MjogQW51YXJpbyBkZSBjb21idXN0aWJsZXMgDQogICsgMTk5MyAtIGFjdHVhbGlkYWQ6IFNFU0NPIERvd25zdHJlYW0NCg0KDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQojIFBST0NFU0FSIEVTVEEgQkFTRQ0KbWVjb25faGlkcm9jYXJidXJvc19kZiA8LSAgcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvTWVjb24vaGlkcm9jYXJidXJvcy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKGluZGljZV90aWVtcG8gPSBjb2xfZGF0ZShmb3JtYXQgPSAiJWQvJW0vJVkiKSksIA0KICAgIGxvY2FsZSA9IGxvY2FsZShlbmNvZGluZyA9ICJJU08tODg1OS0xIikpDQp1bmlxdWUobWVjb25faGlkcm9jYXJidXJvc19kZiRpbmRpY2Fkb3IpDQoNCmBgYA0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNBbnVhcmlvIGRlIGNvbWJ1c3RpYmxlcw0KcHJvZF9hbnVhcmlvIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUHJvZHVjY2lvbi9Qcm9kdWNjaW9uX0Rlc2RlXzE5MTEgLSBjb3BpYS54bHMiKSAlPiUgDQogIHJlbmFtZShhbmlvID0gIkHDkU8iLCBjcnVkb19hbnVhcmlvX01tMyA9ICJQRVRST0xFTyAoTW0zKSIsIA0KICBnYXNfaCA9IGBHQVMgTkFUVVJBTCAoTWlsbC4gbTMpYCwgY2FyYm9uX2ggPSBgQ0FSQk9OIChNVG4pICgqKWApICU+JSANCiAgbXV0YXRlKGdhc19hbnVhcmlvX01NbTMgICA9IGFzLmRvdWJsZShnYXNfaCksIA0KICAgICAgICAgY2FyYm9uX2FudWFyaW9fTXRuICAgPSBhcy5kb3VibGUoY2FyYm9uX2gpLA0KICAgICAgICAgY3J1ZG9fYW51YXJpbyA9IGNydWRvX2FudWFyaW9fTW0zICogMTAwMCkgJT4lIA0KICBzZWxlY3QoYW5pbywgY3J1ZG9fYW51YXJpbywgZ2FzX2FudWFyaW9fTU1tMywgY2FyYm9uX2FudWFyaW9fTXRuICkNCg0KIyBSZXZpc3RhIElERUUNCiMgUHJvZHVjY2nDs24gY3J1ZG8gcG9yIGFkbWluaXN0cmFjacOzbiB5IGNvbnRyYXRvcw0KY3VhZHJvXzIuMSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JldmlzdGFzIFBvbMOtdGljYXMgZGUgUHJlY2lvcyBkZSBsYSBFbmVyZ2lhIGVuIEFyZyAxOTcwLTE5ODgvUHJlY2lvcyBkZWwgcGV0cm9sZW8gY3J1ZG8geSBkZXJpdmFkb3MgMTk3MCAtIDE5ODkueGxzeCIsIA0KICAgIHNraXAgPSAxLCBzaGVldCA9IDEpICU+JSANCiAgcmVuYW1lKHVuaWRhZCA9ICIuLi41IikNCg0KI2Jhc2UgTWluaXN0ZXJpbyBkZSBIYWNpZW5kYQ0KaGlkcm9jYXJidXJvc19iYXNlX21lY29uIDwtICByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NZWNvbi9kYXRhc2V0cyB2aWVqb3MvaGlkcm9jYXJidXJvcy5jc3YiLCANCiAgICBsb2NhbGUgPSBsb2NhbGUoZGF0ZV9uYW1lcyA9ICJlcyIsIGVuY29kaW5nID0gIklTTy04ODU5LTEiKSkgJT4lIA0KICBtdXRhdGUoZmVjaGEgPSBhcy5EYXRlKGx1YnJpZGF0ZTo6cGFyc2VfZGF0ZV90aW1lKGluZGljZV90aWVtcG8sIG9yZGVycyA9ICJkbXkiKSkpICU+JSANCiAgc2VsZWN0KGZlY2hhLCBldmVyeXRoaW5nKC4pLCAtYygxOjMsIGZ1ZW50ZSwgaW5kaWNlX3RpZW1wbyxhbGNhbmNlX2lkKSkNCg0KI2xpc3RhIGNvbiBpbmRpY2Fkb3Jlcw0KbGlzdGFfZmlsdHJvIDwtIHVuaXF1ZShoaWRyb2NhcmJ1cm9zX2Jhc2VfbWVjb24kaW5kaWNhZG9yKQ0KDQoNCnByb2RfbWVjb25fY3J1ZG8gPC0gaGlkcm9jYXJidXJvc19iYXNlX21lY29uICU+JSANCiAgZmlsdGVyKCBpbmRpY2Fkb3IgPT0gbGlzdGFfZmlsdHJvWzNdLA0KICAgICAgICAgYWN0aXZpZGFkX3Byb2R1Y3RvX25vbWJyZSA9PSAiUGV0csOzbGVvIGNydWRvIiwNCiAgICAgICAgIGZyZWN1ZW5jaWFfbm9tYnJlID09ICJNZW5zdWFsIikgJT4lICANCiAgbXV0YXRlKGFuaW8gPSB5ZWFyKGZlY2hhKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCBhY3RpdmlkYWRfcHJvZHVjdG9fbm9tYnJlLCBpbmRpY2Fkb3IsIHVuaWRhZF9kZV9tZWRpZGEpICU+JSANCiAgc3VtbWFyaXNlKGNydWRvX21lY29uID0gc3VtKHZhbG9yKSkNCg0KDQojQmFzZSByZWdhbGlhcw0KcHJvZF9yZWdhbGlhc19jcnVkbyA8LSByZWFkX2RlbGltKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JlZ2FsaWFzL3Byb2R1Y2Npb25fY3J1ZG9fcmVnYWxpYXMuY3N2IiwgDQogICAgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUgDQogIHJlbmFtZShhbmlvID0gIkHDkU8iKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAibTMiLA0KICAgICAgICAgYW5pbyA9em9vOjpuYS5sb2NmKGFuaW8pLA0KICAgICAgICAgZmVjaGEgPSBhcy5EYXRlKHBhcnNlX2RhdGVfdGltZShwYXN0ZTAoYW5pbywgTUVTKSwgb3JkZXJzID0gInltIikpKSAlPiUgDQogIHNlbGVjdChmZWNoYSwgTUVTLCBhbmlvLCB1bmlkYWQsICJUT1RBTCBDVUVOQ0EiLCBldmVyeXRoaW5nKC4pKSAlPiUgDQogIHJlbmFtZShwcm9kX2NydWRvX20zID0gIlRPVEFMIENVRU5DQSIpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkICkgJT4lIA0KICBzdW1tYXJpc2UoY3J1ZG9fcmVnYWxpYXMgPSBzdW0ocHJvZF9jcnVkb19tMykpDQoNCiNCYXNlIFNFU0NPIC5jc3YgIChQcmUgMjAwOSkNCnByb2Rfc2VzY29fY3J1ZG9fYSA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9TRVNDTy9wcm9kdWNjaW4tZGUtcGV0cmxlby1hbnRlcmlvci1hbC0yMDA5LmNzdiIpICU+JQ0KICBzZWxlY3QoYW5pbywgbWVzLGlkY29uY2VwdG8sIGNvbmNlcHRvLCBDYW50aWRhZCApICU+JQ0KICByZW5hbWUoY2FudGlkYWQgPSBDYW50aWRhZCkgJT4lDQogICMgZmlsdGVyKCFpZGNvbmNlcHRvICVpbiUgYyg0LCA1LCA3LCA4LCA5CSkpICU+JQ0KICBmaWx0ZXIoY29uY2VwdG8gJWluJSBjKCJQcm9kdWNjacOzbiBQcmltYXJpYSAobTMpIiwiUHJvZHVjY2nDs24gU2VjdW5kYXJpYSAobTMpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvZHVjY2nDs24gcG9yIFJlY3VwZXJhY2nDs24gQWlzaXN0aWRhIChtMykiKSkgJT4lDQogIGdyb3VwX2J5KGFuaW8pICU+JQ0KICBzdW1tYXJpc2UoY3J1ZG9fc2VzY28gPSBzdW0oY2FudGlkYWQsIG5hLnJtID0gVCkpICU+JQ0KICBtdXRhdGUodW5pZGFkID0gIm0zIikNCg0KIyBCYXNlIFNFU0NPIChQb3N0IDIwMDkpDQpwcm9kX3Nlc2NvX2NydWRvX2IgPC0gcmVhZF9jc3YoDQogICJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1NFU0NPL3Byb2R1Y2Npbi1kZS1wZXRybGVvLXBvci15YWNpbWllbnRvLmNzdiIpICU+JSANCiAgc2VsZWN0KGFuaW8sIG1lcyxpZGNvbmNlcHRvLCBjb25jZXB0bywgY2FudGlkYWQgKSAlPiUNCiAgIyBmaWx0ZXIoIWlkY29uY2VwdG8gJWluJSBjKDQsIDUsIDcsIDgsIDkJKSkgJT4lDQogICMgZmlsdGVyKGlkY29uY2VwdG8gJWluJSBjKDEsMiwzLCA2KSklPiUNCiAgICBmaWx0ZXIoY29uY2VwdG8gJWluJSBjKCJQcm9kdWNjacOzbiBQcmltYXJpYSAobTMpIiwiUHJvZHVjY2nDs24gU2VjdW5kYXJpYSAobTMpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvZHVjY2nDs24gcG9yIFJlY3VwZXJhY2nDs24gQWlzaXN0aWRhIChtMykiKSkgJT4lDQogIGdyb3VwX2J5KGFuaW8pICU+JQ0KICBzdW1tYXJpc2UoY3J1ZG9fc2VzY28gPSBzdW0oY2FudGlkYWQsIG5hLnJtID0gVCkpICU+JQ0KICBtdXRhdGUodW5pZGFkID0gIm0zIikNCg0KcHJvZF9zZXNjb19jcnVkbyA8LSBwcm9kX3Nlc2NvX2NydWRvX2EgJT4lIA0KICBiaW5kX3Jvd3MocHJvZF9zZXNjb19jcnVkb19iKQ0KDQojIFNFU0NPIGRlc2RlIDE5NTANCiAgDQpwcm9kX3NlY19lbmVyZ2lhIDwtIHJlYWQuY3N2KCJkYXRhL3NlY3JldGFyaWFfZW5lcmdpYS9zZXNjby9zZXJpZS1wcm9kdWNjaW9uLXBldHJvbGVvLXRvdGFsLXBhaXMtZGVzZGUtMTk1MC5jc3YiKSAlPiUgDQogIG11dGF0ZShwcm9kdWNjaW9uX3BldHJvbGVvID0gcHJvZHVjY2lvbl9wZXRyb2xlbyoxMDAwLA0KICAgICAgICAgdW5pZGFkID0gIm0zIikgJT4lIA0KICByZW5hbWUoY3J1ZG9fc2VjX2VuZXJnaWEgPSBwcm9kdWNjaW9uX3BldHJvbGVvKSANCg0KDQojRUlBDQoNCiN1bmlkYWQgb3JpZ2luYWwgPSBiYXJyZWxzIHBlciBkYXkNCg0KIyBUb3RhbCBQZXRyb2xldW0gYW5kIG90aGVyIGxpcXVpZHMgcHJvZHVjdGlvbiA9IENydWRlIG9pbCwgTkdQTCwgYW5kIG90aGVyIGxpcXVpZHMgcHJvZHVjdGlvbiArIFJlZmluZXJ5IHByb2Nlc3NpbmcgZ2Fpbg0KIyBDcnVkZSBvaWwsIE5HUEwsIGFuZCBvdGhlciBsaXF1aWRzIHByb2R1Y3Rpb24gPSBDcnVkZSBvaWwgaW5jbHVkaW5nIGxlYXNlIGNvbmRlbnNhdGUgcHJvZHVjdGlvbiArIE5hdHVyYWwgZ2FzIHBsYW50IGxpcXVpZHMgcHJvZHVjdGlvbiArIE90aGVyIGxpcXVpZHMgcHJvZHVjdGlvbg0KDQpwcm9kX2VpYV9jcnVkbyA8LSAgcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0VJQS9kYXRhL29pbF9wcm9kdWN0aW9uX2FyZy5jc3YiLCANCiAgICB0cmltX3dzID0gRkFMU0UsIHNraXAgPSAxKSAlPiUgDQogIGZpbHRlcighaXMubmEoQVBJKSkgJT4lIA0KICBzZWxlY3QoLUFQSSkgJT4lIA0KICBnYXRoZXIoLiwNCiAgICAgICAgIGtleSA9IGFuaW8sDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMjpuY29sKC4pKSAlPiUgDQogIHNwcmVhZCguLA0KICAgICAgICAga2V5ID0gWDIsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yKSAlPiUgDQogIHJlbmFtZSh0b3RhbF9vaWxfYW5kX290aGVyID0gYCAgICAgICAgVG90YWwgcGV0cm9sZXVtIGFuZCBvdGhlciBsaXF1aWRzIChNYi9kKWAsDQogICAgICAgICBjcnVkZV9vaWxfY29uZGVuc2F0ZSA9IGAgICAgICAgICAgICAgICAgQ3J1ZGUgb2lsIGluY2x1ZGluZyBsZWFzZSBjb25kZW5zYXRlIChNYi9kKWAsDQogICAgICAgICBuYXR1cmFsX2dhcyA9IGAgICAgICAgICAgICAgICAgTkdQTCAoTWIvZClgLA0KICAgICAgICAgb3RoZXJfbGlxdWlkcyA9IGAgICAgICAgICAgICAgICAgT3RoZXIgbGlxdWlkcyAoTWIvZClgLA0KICAgICAgICAgY3J1ZGVfb2lsX25ncGxfb3RoZXJfbGlxdWlkcyA9IGAgICAgICAgICAgICBDcnVkZSBvaWwsIE5HUEwsIGFuZCBvdGhlciBsaXF1aWRzIChNYi9kKWAsDQogICAgICAgICByZWZpbmVyeV9wcm9jZXNzaW5nX2dhaW4gPSBgICAgICAgICAgICAgUmVmaW5lcnkgcHJvY2Vzc2luZyBnYWluIChNYi9kKWApICU+JSANCiAgbXV0YXRlX2F0KC52YXJzID0gKGMoImNydWRlX29pbF9jb25kZW5zYXRlIiwgIm5hdHVyYWxfZ2FzIiwgIm90aGVyX2xpcXVpZHMiLCANCiAgICAgICAgICAgICAgICAgICJjcnVkZV9vaWxfbmdwbF9vdGhlcl9saXF1aWRzIiwgInJlZmluZXJ5X3Byb2Nlc3NpbmdfZ2FpbiIgICwidG90YWxfb2lsX2FuZF9vdGhlciIpKSwNCiAgICAuZnVucyA9IGZ1bmN0aW9uKHgpIHt4ICogMzY1ICogMTAwMH0pICU+JSANCiAgbXV0YXRlKGFuaW8gPSBhcy5kb3VibGUoYW5pbyksDQogICAgICAgICB1bmlkYWQgPSAiYmFycmlsZXMiKQ0KDQojRUlBIGFsbCBkYXRhDQplaWFfYWxsX2RhdGEgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0VJQS9kYXRhL2FyZ2VudGluYS9JTlQtRXhwb3J0LTA5LTE3LTIwMjBfMTEtMTUtMTYuY3N2IiwgDQogICAgc2tpcCA9IDEpDQoNCg0KIyBDb21wYXJhY2nDs24gZW50cmUgc2VyaWVzDQpwcm9kX21lcmdlX2NydWRvIDwtICBwcm9kX3JlZ2FsaWFzX2NydWRvICU+JSANCiAgbGVmdF9qb2luKHByb2RfbWVjb25fY3J1ZG8gICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGNydWRvX21lY29uKSkgJT4lDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGNydWRvX3JlZ2FsaWFzLCBjcnVkb19tZWNvbikgJT4lIA0KICBsZWZ0X2pvaW4ocHJvZF9zZXNjb19jcnVkbykgJT4lIA0KICBmdWxsX2pvaW4ocHJvZF9hbnVhcmlvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGNydWRvX2FudWFyaW8pICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKHVuaWRhZCA9ICJtMyIpKSAlPiUgDQogIGxlZnRfam9pbihwcm9kX3NlY19lbmVyZ2lhLCBieSA9IGMoImFuaW8iLCAidW5pZGFkIikpICU+JSANCiAgIyBtdXRhdGUoZGlmID0gIGNydWRvX3JlZ2FsaWFzL2NydWRvX21lY29uLTEpICU+JSANCiAgbXV0YXRlX2F0KC52YXJzID0gYyggICAiY3J1ZG9fcmVnYWxpYXMiICwiY3J1ZG9fbWVjb24iLCAgIA0KICAgICAgICAgICAgICAgICAgICAgICAiY3J1ZG9fc2VzY28iLCAgICAiY3J1ZG9fYW51YXJpbyIsICJjcnVkb19zZWNfZW5lcmdpYSIgKSwgDQogICAgICAgICAgICAuZnVucyA9IGNvbnZlcnNvcl9tM2JibF9xKSAlPiUgIA0KICBsZWZ0X2pvaW4ocHJvZF9laWFfY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgY3J1ZG9fZWlhID0gY3J1ZGVfb2lsX2NvbmRlbnNhdGUpKSAlPiUgDQogICBtdXRhdGUocHJvZF9jcnVkbyA9ICBjYXNlX3doZW4oYW5pbyA8IDE5NTAgfiBjcnVkb19hbnVhcmlvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gJWluJSAxOTUwOjIwMTUgfmNydWRvX3NlY19lbmVyZ2lhICwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+IDIwMTUgfiBjcnVkb19zZXNjbyApLA0KICAgICAgICAgIHVuaWRhZCA9ICJiYXJyaWxlcyIsIA0KICAgICAgICAgIHZhcmlhYmxlID0gICJQcm9kdWNjacOzbiBkZSBjcnVkbyBzZWfDum4gZGlzdGludGFzIGZ1ZW50ZXMiKSAgJT4lDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICBzZWxlY3QoYW5pbywgdmFyaWFibGUsIHVuaWRhZCwgcHJvZF9jcnVkbywgZXZlcnl0aGluZyguKSkgJT4lIA0KICByZW5hbWUocmVnYWxpYXMgPSBjcnVkb19yZWdhbGlhcywNCiAgICAgICAgIG1lY29uID0gY3J1ZG9fbWVjb24sDQogICAgICAgICBzZXNjbyA9IGNydWRvX3Nlc2NvLA0KICAgICAgICAgYW51YXJpb19jb21idXN0aWJsZXMgPSBjcnVkb19hbnVhcmlvLA0KICAgICAgICAgZWlhID0gY3J1ZG9fZWlhKSAlPiUgDQogIGZpbHRlcihhbmlvIDwgMjAyMSkNCg0KDQojIHdyaXRlLmNzdihwcm9kX21lcmdlX2NydWRvLCBmaWxlID0gInJlc3VsdGFkb3MvcHJvZHVjY2lvbl9jcnVkby5jc3YiKQ0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KHByb2RfbWVyZ2VfY3J1ZG8sIA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9wcm9kdWNjaW9uX2NydWRvLnhsc3giKQ0KDQojZGlmZXJlbmNpYSBwcm9tZWRpbyBkZWwgNiUgZW50cmUgbGFzIGJhc2VzIChlcyBtYXlvciBsYSBkZSBtZWNvbikNCiMgc3VtbWFyeShwcm9kX21lcmdlX2NydWRvKQ0KDQoNCiNFeGlzdGVuY2lhcw0KZXhpc3RlbmNpYXNfcGV0cm9sZW8gPC0gcmVhZF9leGNlbCgiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvZXhpc3RlbmNpYXNfY3J1ZG8ueGxzeCIpICU+JQ0KICBmaWx0ZXIoIShpcy5uYShleGlzdGVuY2lhcyApKSkgJT4lIA0KICByZW5hbWUoZXhpc3RlbmNpYXNfY3J1ZG8gPSBleGlzdGVuY2lhcykgJT4lIA0KICBtdXRhdGUoZXhpc3RlbmNpYXNfY3J1ZG8gPSBjb252ZXJzb3JfbTNiYmxfcShleGlzdGVuY2lhc19jcnVkbyksDQogICAgICAgICB1bmlkYWQgPSAiYmFycmlsZXMiKQ0KDQojIHBsb3QoZXhpc3RlbmNpYXNfcGV0cm9sZW8kYW5pbywgZXhpc3RlbmNpYXNfcGV0cm9sZW8kZXhpc3RlbmNpYXNfY3J1ZG8pDQoNCmBgYA0KDQo8YnI+DQoqKlRhYmxhIDEuIFByb2R1Y2Npw7NuIGRlIHBldHLDs2xlbyBjcnVkbyBlbiBBcmdlbnRpbmEgc2Vnw7puIGRpc3RpbnRhcyBmdWVudGVzIChiYXJyaWxlcykqKg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnByb2RfbWVyZ2VfY3J1ZG8gJT4lIA0KICBzZWxlY3QoLXByb2RfY3J1ZG8pDQogDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90bHkocHJvZF9tZXJnZV9jcnVkbyAlPiUgDQogIG11dGF0ZShyZWdhbGlhcyA9IGNhc2Vfd2hlbihyZWdhbGlhcyA9PSAwIH4gTkFfcmVhbF8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gcmVnYWxpYXMpKSAlPiUNCiAgICBzZWxlY3QoLXByb2RfY3J1ZG8pICU+JSANCiAgZ2F0aGVyKGtleSA9IGZ1ZW50ZSwgdmFsdWUgPSB2YWxvciwgNDpuY29sKC4pKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gZnVlbnRlKSkrDQogIGdlb21fbGluZSgpKw0KICBsYWJzKHRpdGxlID0gIkdyw6FmaWNvIDEuIFByb2R1Y2Npw7NuIGRlIHBldHLDs2xlbyBjcnVkby4NCiAgICAgICAgQXJnZW50aW5hICgxOTExIC0gMjAyMCkiLA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgQmFycmlsZXMiLA0KICAgICAgIGNhcHRpb24gPSAiRnVlbnRlOiBlbGFib3JhY2nDs24gcHJvcGlhIGVuIGJhc2UgYSBBbnVhcmlvIGRlIENvbWJ1c3RpYmxlcywgRUlBLCBNaW5pc3RlcmlvIGRlIEVjb25vbcOtYSwgU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgKEJhc2UgUmVnYWzDrWFzIHkgU0VTQ08pIikrDQogICMgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1mdW5jdGlvbih4KSBmb3JtYXQoeCwgYmlnLm1hcmsgPSAiLiIsIHNjaWVudGlmaWMgPSBGQUxTRSkpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjp1bml0X2Zvcm1hdCh1bml0ID0iIiwgc2NhbGUgPSAxZS02KSkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCiAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgDQpgYGANCg0KDQoNCiMjIyBQcm9kdWNjacOzbiBkZSBHYXMgTmF0dXJhbA0KDQpBbCBpZ3VhbCBxdWUgZW4gbGEgcHJvZHVjY2nDs24gZGUgcGV0csOzbGVvIGNydWRvLCBsYSBzZXJpZSBkZSBsYXJnbyBwbGF6byBkZSBwcm9kdWNjacOzbiBkZSBnYXMgcHJvdmllbmUgZGVsIEFudWFyaW8gZGUgQ29tYnVzdGlibGVzLCBkZSBsYSBjdWFsIGNvbnRhbW9zIGRhdG9zIGRlc2RlIDE5MTMgaGFzdGEgMTk5Mi4gQSBkaWZlcmVuY2lhIGRlbCBjcnVkbywgc3VzIHZhbG9yZXMgcGFyYSBlbCBwZXLDrW9kbyAxOTgwLTE5OTIgbm8gY29pbmNpZGVuIGNvbiBsb3MgZGUgRUlBLCBwZXJvIGVzdMOhIMO6bHRpbWEgc8OtIGNvaW5jaWRlIGNvbiBsb3MgZGUgUmVnYWzDrWFzIGVudHJlIDE5OTkgeSAyMDE1LiBFbiBjYW1iaW8sIGxhIHNlcmllIGRlIFNFU0NPLCB0aWVuZGUgYSBjb250aW51YXIgbGEgZXZvbHVjacOzbiBkZSBFSUEgeSBSZWdhbMOtYXMsIHBlcm8gY29uIGVsIG5pdmVsIGRlbCBBbnVhcmlvIGRlIENvbWJ1c3RpYmxlcywgcG9yIGxvIHF1ZSBhbWJvcyBwYXJlcyBkZSBzZXJpZXMgcHVlZGVuIGVtcGFsbWFyIGNvaGVyZW50ZW1lbnRlIHNlZ8O6biBzdSBuaXZlbC4gTnVldmFtZW50ZSwgbG9zIHZhbG9yZXMgZGUgbGEgYmFzZSBkZSBSZWdhbMOtYXMgc29uIG1lbm9yZXMgZGViaWRvIGEgbGFzIGRlZHVjY2lvbmVzIGRlIHByb2R1Y2Npw7NuIHBhcmEgdHJpYnV0YXIgbWVub3MgcmVnYWzDrWFzLiBMYSBzZXJpZSBkZWwgTWluaXN0ZXJpbyBkZSBFY29ub23DrWEgdG9tYSBsb3MgdmFsb3JlcyBkZSBTRVNDTy5Qb3IgbG8gdGFudG8sIGVsIGNyaXRlcmlvIGRlIHNlbGVjY2nDs24gcGFyYSBsYSBzZXJpZSBkZSBwcm9kdWNjacOzbiBkZSBnYXMgcGFyYSBsb3MgY8OhbGN1bG9zIGVzIGVsIHNpZ3VpZW50ZToNCg0KKiBDcml0ZXJpbyBkZSBjw7NtcHV0byBkZSBsYSBwcm9kdWNjacOzbiBkZSBnYXM6DQogICsgMTkxMSBhIDE5OTI6IEFudWFyaW8gZGUgY29tYnVzdGlibGVzIA0KICArIDE5OTMgZW4gYWRlbGFudGU6IFNFU0NPIERvd25zdHJlYW0NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNCYXNlIE1FQ09ODQpwcm9kX21lY29uX2dhcyA8LSBoaWRyb2NhcmJ1cm9zX2Jhc2VfbWVjb24gJT4lIA0KICBmaWx0ZXIoaW5kaWNhZG9yID09IGxpc3RhX2ZpbHRyb1szXSwNCiAgICAgICAgIGFjdGl2aWRhZF9wcm9kdWN0b19ub21icmUgPT0gIkdhcyBuYXR1cmFsIiwNCiAgICAgICAgIGZyZWN1ZW5jaWFfbm9tYnJlID09ICJNZW5zdWFsIikgJT4lICANCiAgbXV0YXRlKGFuaW8gPSB5ZWFyKGZlY2hhKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCBhY3RpdmlkYWRfcHJvZHVjdG9fbm9tYnJlLCBpbmRpY2Fkb3IsIHVuaWRhZF9kZV9tZWRpZGEpICU+JSANCiAgc3VtbWFyaXNlKGdhc19tZWNvbiA9IHN1bSh2YWxvcikpDQoNCiNCYXNlIHJlZ2FsaWFzDQpwcm9kX3JlZ2FsaWFzX2dhcyA8LSByZWFkX2RlbGltKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JlZ2FsaWFzL3Byb2R1Y2Npb25fZ2FzX3JlZ2FsaWFzLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw5FPIikgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIk1pbGVzIGRlIG0zIiwNCiAgICAgICAgIGFuaW8gPSB6b286Om5hLmxvY2YoYW5pbyksDQogICAgICAgICBmZWNoYSA9IGFzLkRhdGUocGFyc2VfZGF0ZV90aW1lKHBhc3RlMChhbmlvLCBNRVMpLCBvcmRlcnMgPSAieW0iKSkpICU+JSANCiAgc2VsZWN0KGZlY2hhLCB1bmlkYWQsICJUT1RBTCBDVUVOQ0EiLCBldmVyeXRoaW5nKC4pKSAlPiUgDQogIHJlbmFtZShwcm9kX2dhc19NbTMgPSAiVE9UQUwgQ1VFTkNBIikgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQgKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKSAlPiUgDQogIHN1bW1hcmlzZShnYXNfcmVnYWxpYXMgPSBzdW0ocHJvZF9nYXNfTW0zKSkNCg0KI0Jhc2UgU0VTQ08NCiNwcmUgMjAwOQ0KcHJvZF9zZXNjb19nYXNfYSA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9TRVNDTy9wcm9kdWNjaW4tZGUtZ2FzLWFudGVyaW9yLWFsLTIwMDkuY3N2IikgICU+JSANCiAgc2VsZWN0KGFuaW8sIG1lcyxpZGNvbmNlcHRvLCBjb25jZXB0bywgQ2FudGlkYWQgKSAlPiUNCiAgcmVuYW1lKGNhbnRpZGFkID0gQ2FudGlkYWQpICU+JQ0KICBmaWx0ZXIoaWRjb25jZXB0byAhPSA0KSAlPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lDQogIHN1bW1hcmlzZShnYXNfc2VzY28gPSBzdW0oY2FudGlkYWQsIG5hLnJtID0gVCkpICU+JQ0KICBtdXRhdGUodW5pZGFkID0gIk1pbGVzIGRlIG0zIikNCg0KI3Bvc3QgMjAwOQ0KcHJvZF9zZXNjb19nYXNfYiA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9TRVNDTy9wcm9kdWNjaW4tZGUtZ2FzLXBvci15YWNpbWllbnRvLmNzdiIpICU+JSANCiAgc2VsZWN0KGFuaW8sIG1lcyxpZGNvbmNlcHRvLCBjb25jZXB0bywgY2FudGlkYWQgKSAlPiUNCiAgZmlsdGVyKGlkY29uY2VwdG8gJWluJSBjKDEsMiwzKSklPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lDQogIHN1bW1hcmlzZShnYXNfc2VzY28gPSBzdW0oY2FudGlkYWQsIG5hLnJtID0gVCkpICU+JQ0KICBtdXRhdGUodW5pZGFkID0gIk1pbGVzIGRlIG0zIikNCg0KcHJvZF9zZXNjb19nYXMgPC0gcHJvZF9zZXNjb19nYXNfYSAlPiUNCiAgYmluZF9yb3dzKHByb2Rfc2VzY29fZ2FzX2IpDQoNCg0KI0VJQQ0KcHJvZF9laWFfZHJ5X25hdHVyYWxfZ2FzIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9FSUEvZGF0YS9EcnlfbmF0dXJhbF9nYXNfcHJvZHVjdGlvbl9BcmdlbnRpbmFfQW5udWFsLmNzdiIsIA0KICAgIHNraXAgPSA0KSAgJT4lIA0KICByZW5hbWUoYW5pbyA9IFllYXIsDQogICAgICAgICBwcm9kX2VpYSA9IGBTZXJpZXMgSUQ6IElOVEwuMjYtMS1BUkctQkNGLkEgYmlsbGlvbiBjdWJpYyBmZWV0YCkgJT4lIA0KICBtdXRhdGUocHJvZF9laWEgPSBjb252ZXJzb3JfZnQzbTNfcShwcm9kX2VpYSAqIDEwMDAwMDApLA0KICAgICAgICAgdW5pZGFkID0gIk1pbGVzIGRlIG0zIikNCg0KDQojIENvbXBhcmFjacOzbiBlbnRyZSBzZXJpZXMNCnByb2RfbWVyZ2VfZ2FzIDwtICBwcm9kX3JlZ2FsaWFzX2dhcyAlPiUgDQogIGxlZnRfam9pbihwcm9kX21lY29uX2dhcyAgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZ2FzX21lY29uKSkgJT4lDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGdhc19yZWdhbGlhcywgZ2FzX21lY29uKSAlPiUgDQogIGxlZnRfam9pbihwcm9kX3Nlc2NvX2dhcykgJT4lICANCiAgZnVsbF9qb2luKHByb2RfYW51YXJpbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBnYXNfYW51YXJpbyA9IGdhc19hbnVhcmlvX01NbTMgKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShnYXNfYW51YXJpbyA9IGdhc19hbnVhcmlvICogMTAwMCwNCiAgICAgICAgICAgICAgICAgICAgIHVuaWRhZCA9ICJNaWxlcyBkZSBtMyIpKSAlPiUgDQogIGxlZnRfam9pbihwcm9kX2VpYV9kcnlfbmF0dXJhbF9nYXMgJT4lIHJlbmFtZShnYXNfZWlhID0gcHJvZF9laWEpKSAlPiUgDQogIG11dGF0ZShwcm9kX2dhcyA9IGNhc2Vfd2hlbihhbmlvIDwgMTk5MyB+IGdhc19hbnVhcmlvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPiAxOTkyIH4gZ2FzX3Nlc2NvKSwNCiAgICAgICAgICB2YXJpYWJsZSA9ICAiUHJvZHVjY2nDs24gZGUgZ2FzIHNlZ8O6biBkaXN0aW50YXMgZnVlbnRlcyIpICU+JSANCiAgYXJyYW5nZShhbmlvKSAlPiUgDQogIHNlbGVjdChhbmlvLCB2YXJpYWJsZSwgdW5pZGFkLCBwcm9kX2dhcywgZXZlcnl0aGluZyguKSkgJT4lIA0KICAgZmlsdGVyKCFpcy5uYShwcm9kX2dhcykpICU+JSANCiAgcmVuYW1lKHJlZ2FsaWFzID0gZ2FzX3JlZ2FsaWFzLA0KICAgICAgICAgbWVjb24gPSBnYXNfbWVjb24sDQogICAgICAgICBzZXNjbyA9IGdhc19zZXNjbywNCiAgICAgICAgIGFudWFyaW9fY29tYnVzdGlibGVzID1nYXNfYW51YXJpbywNCiAgICAgICAgIGVpYSA9IGdhc19laWEpICU+JSANCiAgZmlsdGVyKGFuaW8gPCAyMDIxKQ0KDQoNCiMgd3JpdGUuY3N2KHByb2RfbWVyZ2VfZ2FzLCBmaWxlID0gInJlc3VsdGFkb3MvcHJvZHVjY2lvbl9nYXMuY3N2IikNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChwcm9kX21lcmdlX2dhcywgDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL3Byb2R1Y2Npb25fZ2FzLnhsc3giKQ0KDQojZGlmZXJlbmNpYSBwcm9tZWRpbyBkZWwgMTQlIGVudHJlIGxhcyBiYXNlcyAoZXMgbWF5b3IgbGEgZGUgbWVjb24pDQojIHN1bW1hcnkocHJvZF9tZXJnZV9nYXMpDQoNCnByb2RfbWVyZ2VfZ2FzX01NQlRVIDwtIHByb2RfbWVyZ2VfZ2FzICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdmFyaWFibGUsIHVuaWRhZCkgJT4lIA0KICBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpIHtjb252ZXJzb3JfbTNNTUJUVV9xKHgqMTAwMCl9KSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiTU1CVFUiKSAlPiUNCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSkNCiAgDQpwcm9kX21lcmdlX2dhc19iZXAgPC0gcHJvZF9tZXJnZV9nYXNfTU1CVFUgJT4lIA0KICBncm91cF9ieShhbmlvLCB2YXJpYWJsZSwgdW5pZGFkKSAlPiUgDQogIG11dGF0ZV9hbGwoY29udmVyc29yX01NQlRVYmVwX3EpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJCRVAiKQ0KICANCiMgd3JpdGUuY3N2KHByb2RfbWVyZ2VfZ2FzX2JlcCwgZmlsZSA9ICJyZXN1bHRhZG9zL3Byb2RfbWVyZ2VfZ2FzX2JlcC5jc3YiKQ0KYGBgDQoNCjxicj4NCioqVGFibGEgMi4gUHJvZHVjY2nDs24gZGUgZ2FzIG5hdHVyYWwgZW4gQXJnZW50aW5hIHNlZ8O6biBkaXN0aW50YXMgZnVlbnRlcyAoTU1CVFUpKioNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwcm9kX21lcmdlX2dhc19NTUJUVSAlPiUgDQogIHNlbGVjdCgtcHJvZF9nYXMpDQoNCmBgYA0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdGx5KHByb2RfbWVyZ2VfZ2FzX01NQlRVICU+JSANCiAgICAgICAgICAgc2VsZWN0KC1wcm9kX2dhcykgJT4lDQogIG11dGF0ZShyZWdhbGlhcyA9IGNhc2Vfd2hlbihyZWdhbGlhcyA9PSAwIH4gTkFfcmVhbF8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gcmVnYWxpYXMpKSAlPiUgDQogIGdhdGhlcihrZXkgPSBmdWVudGUsIHZhbHVlID0gdmFsb3IsIDQ6bmNvbCguKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IGZ1ZW50ZSkpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh0aXRsZSA9ICJHcsOhZmljbyAyLiBQcm9kdWNjacOzbiBkZSBnYXMuDQogICAgICAgIEFyZ2VudGluYSAoMTkxMyAtIDIwMjApIiwNCiAgICAgICB5ID0gIk1NQlRVIiwNCiAgICAgICBjYXB0aW9uID0gIkZ1ZW50ZTogZWxhYm9yYWNpw7NuIHByb3BpYSBlbiBiYXNlIGEgQW51YXJpbyBkZSBDb21idXN0aWJsZXMsIEVJQSwgTWluaXN0ZXJpbyBkZSBFY29ub23DrWEsIFNlY3JldGFyw61hIGRlIEVuZXJnw61hIChCYXNlIFJlZ2Fsw61hcyB5IFNFU0NPKSIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPWZ1bmN0aW9uKHgpIGZvcm1hdCh4LCBiaWcubWFyayA9ICIuIiwgc2NpZW50aWZpYyA9IEZBTFNFKSkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCmBgYA0KDQojIyMgUHJvZHVjY2lvbiB0b3RhbA0KYGBge3J9DQpwcm9kdWNjaW9uX3RvdGFsIDwtIHByb2RfbWVyZ2VfZ2FzX2JlcCAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQscHJvZF9nYXMpICU+JQ0KICBsZWZ0X2pvaW4ocHJvZF9tZXJnZV9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQscHJvZF9jcnVkbykgJT4lICBtdXRhdGUodW5pZGFkID0iQkVQIikgKSAlPiUgDQogIG11dGF0ZShwcm9kdWNjaW9uX3RvdGFsX2JlcCA9IHByb2RfY3J1ZG8gKyBwcm9kX2dhcykNCg0KcHJvZHVjY2lvbl90b3RhbA0KYGBgDQoNCg0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIyBDcnVkbyBwcm9jZXNhZG8NCg0KYGBgDQoNCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyMgVmVudGFzDQogIyBDcnVkbyB5IEdhcw0KDQojICogW1NFU0NPIC0gUmVmaW5hY2nDs24geSBDb21lcmNpYWxpemFjacOzbiBkZSBwZXRyw7NsZW8sIGdhcyB5IGRlcml2YWRvc10oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L3JlZmluYWNpb24teS1jb21lcmNpYWxpemFjaW9uLWRlLXBldHJvbGVvLWdhcy15LWRlcml2YWRvcy10YWJsYXMtZGluYW1pY2FzKQ0KIyANCiMgIERhdG9zIGRlIGNhbnRpZGFkZXMNCiMgIA0KI2NvbXByYXMgZW1wcmVzYXMgZGVsIHNlY3Rvcg0KY29tcHJhcyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9TRVNDTy9SZWZpbmFjacOzbiB5IGNvbWVyY2lhbGl6YWNpb24vY29tcHJhcy5jc3YiKQ0KDQojdmVudGFzIG1kbyBpbnRlcm5vLiBjYW50aWRhZGVzLiBwb3N0IDIwMTANCnZlbnRhc19tZXJjYWRvX3Byb2R1Y3RvX2VtcHJlc2EgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvU0VTQ08vUmVmaW5hY2nDs24geSBjb21lcmNpYWxpemFjaW9uL3ZlbnRhcy1tZXJjYWRvLXByb2R1Y3RvLWVtcHJlc2EuY3N2IiwgDQogICAgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gIklTTy04ODU5LTEiKSkNCg0KI3ZlbnRhcyBtZG8gaW50ZXJuby4gY2FudGlkYWRlcy4gcG9zdCAyMDEwDQp2ZW50YXNfYV9lbXByZXNhc19kZWxfc2VjdG9yIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1NFU0NPL1JlZmluYWNpw7NuIHkgY29tZXJjaWFsaXphY2lvbi92ZW50YXMtYS1lbXByZXNhcy1kZWwtc2VjdG9yLmNzdiIpDQoNCmBgYA0KDQoNCiMjIFByZWNpbyBNZXJjYWRvIEludGVybm8NCg0KRnVlbnRlczogDQoNCiogW0Jhc2UgTWluaXN0ZXJpbyBkZSBIYWNpZW5kYSwgSW5mb3JtZXMNClNlY3RvcmlhbGVzXShodHRwczovL3d3dy5hcmdlbnRpbmEuZ29iLmFyL2Vjb25vbWlhL3BvbGl0aWNhZWNvbm9taWNhL3JlZ2lvbmFseXNlY3RvcmlhbC9pbmZvcm1lc3Byb2R1Y3Rpdm9zKQ0KKiBbU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEtUmVnYWxpYXNdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9yZWdhbGlhcy1kZS1wZXRyb2xlby1jcnVkby1nYXMtbmF0dXJhbC1nbHAtZ2Fzb2xpbmEteS1jb25kZW5zYWRvKQ0KICArIFBvciBhdXNlbmNpYSBkZSBpbmZvcm1hY2nDs24sIGVsIHByZWNpbyBkZSByZWdhbGlhcyBlbnRyZSAxOTkzIHkgMTk5OCBlcyBlbCBwcmVjaW8gdG90YWwgKGVzIGRlY2lyLCBlcyB1biBwb25kZXJhZG8gcXVlIGluY2x1eWUgdGFtYmnDqW4gZWwgcHJlY2lvIGRlbCBtZXJjYWRvIGV4dGVybm8pLiBFbiBsb3MgYcOxb3MgcG9zdGVyaW9yZXMsIGRpY2hvIHByZWNpbyBzw60gY29ycmVzcG9uZGUgYWwgZGVsIG1lcmNhZG8gaW50ZXJuby4gIA0KKiBLb3p1bGogeSBQaXN0b25lc2kuIFJldmlzdGEgIGRlbCBJbnN0aXR1dG8gZGUgRWNvbm9tw61hIEVuZXJnw6l0aWNhIChJREVFKSAtIEZ1bmRhY2nDs24gQmFyaWxvY2hlICAoMTk3MCAtIDE5ODgpLiBQcmVjaW8gb2ZpY2lhbCBpbnRlcm5vIGRlIGxhIGN1ZW5jYSBuZXVxdWluYSBhIHRhc2EgZGUgY2FtYmlvIG9maWNpYWwuIExhcyBmdWVudGVzIHV0aWxpemFkYXMgZGUgZXN0YSByZXZpc3RhIHNvbiBTZWNyZXRhcmlhIGRlIEVuZXJnw61hLCBZUEYsIEdhcyBkZWwgRXN0YWRvLCBCb2xldGluIEluZm9ybWF0aXZvIGRlIFRlY2hpbnQgeSBzZXJpZXMgcHJvcGlhcyBkZSBJREVFDQoqIE1lbW9yaWEgQW51YWwgeSBiYWxhbmNlcyBjb250YWJsZXMgZGUgWVBGICh2YXJpb3MgYcOxb3MpLiBQcmVjaW8gaW50ZXJvIHByb21lZGlvIHJlc3VsdGFudGUgZGUgbGEgcmVsYWNpw7NuIGVudHJlIHZlbnRhcyB5IGNhbnRpZGFkZXMgcHJvZHVjaWRhcy4NCiogUHJlY2lvcyBhbnVhcmlvLiAqKkZBTFRBIEJVU0NBUioqDQoNCioqKnZlciBkZSBkb25kZSBzYWNhbiBlbCBUQ0MqKioNCioqKmNhbWJpYXIgcHJlY2lvIGRlbCA5MiBwb3IgbWVjb24gZXN0aW1hZG8geSB2YWxvcmVzIHJlc3RhbnRlcyBwb3IgZXN0aW1hZG8gZGUgaWRlZSoqKg0KDQojIyMjICBQcmVjaW8gTWVyY2FkbyBJbnRlcm5vIGRlIENydWRvDQoNCiogQ3JpdGVyaW8gcGFyYSBwcmVjaW9fY3J1ZG86IA0KICArIDE5NjMgYSAxOTY1OiBLb3p1bGogeSBQaXN0b25lc2kgLSBSZXZpc3RhIElERUUgYWp1c3RhZG8gY29uIGVsIMOtbmRpY2UgZGVsIHByZWNpbyBkZWwgQW51YXJpbyBkZSBZUEYgDQogICsgMTk4OSBhIDE5OTE6IEFudWFyaW8gZGUgWVBGDQogICsgMTk2NiBhIDE5ODg6IEtvenVsaiB5IFBpc3RvbmVzaSAtIFJldmlzdGEgSURFRQ0KICArIDE5OTI6IE1FQ09OIGFqdXN0YWRvIGNvbiBsYSB2YXJpYWNpw7NuIGRlbCDDjW5kaWNlIGRlIHByZWNpb3MgaW50ZXJub3MgYWwgcG9yIG1heW9yIChJUElNKQ0KICArIDE5OTMgZW4gYWRlbGFudGU6IE1FQ09OIA0KIA0KICANCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojTWVtb3JpYXMgZGUgWVBGDQp2dGFzX3ByZWNpb19tZW1vX3lwZl9jcnVkbyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL01lbW9yaWEgWVBGL3Z0YXNfdmFsb3JfY2FudGlkYWRfcHJlY2lvX2NydWRvLnhsc3giKSAlPiUgDQogIHJlbmFtZShjYW50X3ZlbmRpZGFkID0gIm0zIiwgdmFsb3JfdmVuZGlkbyA9ICJ2YWxvciIsIHByZWNpb19hID0gIiQvbTMiLCANCiAgICAgICAgIHRjY19kaWMgPSAiQ290aXogZGljIFUkUyIsIHByZWNpb191c2QgPSAiVSRTIChhIGRpY2llbWJyZSBkZSBjYWRhIGHDsW8pIikgJT4lIA0KICBtdXRhdGUodW5pZGFkX2NhbnQgPSAibTMiLA0KICAgICAgICAgcHJlY2lvX21pX3Blc29zX3lwZl9jcnVkbyA9IHZhbG9yX3ZlbmRpZG8vY2FudF92ZW5kaWRhZCwgDQogICAgICAgICBwcmVjaW9fbWlfeXBmX2NydWRvID0gcHJlY2lvX21pX3Blc29zX3lwZl9jcnVkbyAvIHRjY19kaWMpICU+JSANCiAgIyBsZWZ0X2pvaW4odGNwX2FudWFsX2IgJT4lIHNlbGVjdChhbmlvLCB0Y2MpKSAlPiUNCiAgIyBtdXRhdGUocHJlY2lvX21pX3VzZF95cGZfY3J1ZG8gPSBwcmVjaW9fbWlfeXBmX2NydWRvIC8gdGNjKSAlPiUgI3JlY2FsY3VsbyBkZSBwcmVjaW8gY29uIG51ZXZvIFRDDQogIHNlbGVjdChhbmlvLHVuaWRhZF9jYW50LCBtb25lZGEsIHZhbG9yX3ZlbmRpZG8sIGNhbnRfdmVuZGlkYWQsIA0KICAgICAgICAgcHJlY2lvX21pX3Blc29zX3lwZl9jcnVkbyx0Y2NfZGljLCAgcHJlY2lvX21pX3lwZl9jcnVkbykNCg0KIyBCYXNlIE1FQ09ODQpwcmVjaW9fbWlfbWVjb25fY3J1ZG8gPC0gaGlkcm9jYXJidXJvc19iYXNlX21lY29uICU+JSANCiAgZmlsdGVyKGluZGljYWRvciA9PSBsaXN0YV9maWx0cm9bMl0sIA0KICAgICAgICAgYWN0aXZpZGFkX3Byb2R1Y3RvX25vbWJyZSA9PSAiUGV0csOzbGVvIGNydWRvIiwNCiAgICAgICAgIGFsY2FuY2VfdGlwbyA9PSAiUEFJUyIpICU+JQ0KICBtdXRhdGUoYW5pbyA9IHllYXIoZmVjaGEpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKHByZWNpb19taV9tZWNvbl9jcnVkbyA9IG1lYW4odmFsb3IpKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiVVNEL20zIikNCg0KDQojTUVDT04gLyBDVUVOVEFTIE5BQ0lPTkFMRVMgDQpwcmVjaW9zX21lY29uIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvTWVjb24vYmFzZS1taW5lcmlhLWUtaGlkcm9jYXJidXJvcyBjdWVudGFzIG5hY2lvbmFsZXMueGxzIiwgDQogICAgc2hlZXQgPSAiUHJlY2lvcyIsIHNraXAgPSA3KSAlPiUgDQogIHJlbmFtZShhbmlvID0gIi4uLjEiLA0KICAgICAgICAgbWVzID0gIi4uLjIiLA0KICAgICAgICAgcHJlY2lvX2NvYnJlX2NfbGIgPSAiQ290aXphY2nDs24gQm9sc2EgZGUgTG9uZHJlcyAoTE1FKSIsDQogICAgICAgICBwcmVjaW9fb3JvX3VzZF9venQgPSAgIkNvdGl6YWNpw7NuIEJvbHNhIGRlIE51ZXZhIFlvcmsgKENPTUVYKSIsDQogICAgICAgICBwcmVjaW9fcGxhdGFfdXNkX296dCA9ICJDb3RpemFjacOzbiBMb25kb24gQnVsbGlvbiBNYXJrZXQgQXNzb2NpYXRpb24gKExCTUEpIiwNCiAgICAgICAgIHByZWNpb19jaW5jX2NfbGIgPSAiQ290aXphY2nDs24gTE1FIiwNCiAgICAgICAgIHByZWNpb19oaWVycm9fdXNkX3RuID0gIjY3LDU1JSBCcmFzaWwiLA0KICAgICAgICAgcHJlY2lvX3Bsb21vX3VzZF90biA9ICJMb25kb24gTWV0YWwgRXhjaGFuZ2UiLA0KICAgICAgICAgcHJlY2lvX2dhc19tZV9wZXNvc19NbTMgPSAibWVyY2FkbyBleHRlcm5vLi4uOSIsDQogICAgICAgICBwcmVjaW9fZ2FzX21pX3Blc29zX01tMyA9ICJtZXJjYWRvIGludGVybm8uLi4xMCIsDQogICAgICAgICBwcmVjaW9fY3J1ZG9fbWVfdXNkX20zID0gIm1lcmNhZG8gZXh0ZXJuby4uLjExIiwNCiAgICAgICAgIHByZWNpb19jcnVkb19tZV91c2RfYmJsICA9ICIuLi4xMiIsDQogICAgICAgICBwcmVjaW9fY3J1ZG9fbWlfdXNkX20zID0gIm1lcmNhZG8gaW50ZXJuby4uLjEzIiwNCiAgICAgICAgIHByZWNpb19jcnVkb19taV91c2RfYmJsICA9ICIuLi4xNCIsDQogICAgICAgICBwcm9tZWRpb19icmVudF9kdWJhaV93dGlfdXNkX2JibCA9ICJQcm9tZWRpbyBCcmVudC1EdWJhaS1XVEkiLA0KICAgICAgICAgYnJlbnRfdWtfdXNkX2JibCA9IkJyZW50ICBQdWVydG9zIEdyYW4gQnJldGHDsWEiKSAlPiUgDQogIGZpbHRlcighaXMubmEoYW5pbykpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UocHJlY2lvX2dhc19tZV9wZXNvc19NbTMgPSBtZWFuKHByZWNpb19nYXNfbWVfcGVzb3NfTW0zLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgcHJlY2lvX2dhc19taV9wZXNvc19NbTMgPSBtZWFuKCBwcmVjaW9fZ2FzX21pX3Blc29zX01tMywgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIHByZWNpb19jcnVkb19tZV91c2RfYmJsID0gbWVhbiggcHJlY2lvX2NydWRvX21lX3VzZF9iYmwsIG5hLnJtID0gVCksDQogICAgICAgICAgICBwcmVjaW9fY3J1ZG9fbWlfdXNkX2JibCA9IG1lYW4oIHByZWNpb19jcnVkb19taV91c2RfYmJsLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgcHJvbWVkaW9fYnJlbnRfZHViYWlfd3RpX3VzZF9iYmwgPSBtZWFuKCBwcm9tZWRpb19icmVudF9kdWJhaV93dGlfdXNkX2JibCwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIGJyZW50X3VrX3VzZF9iYmwgPSBtZWFuKCBicmVudF91a191c2RfYmJsLCBuYS5ybSA9IFQpKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWwpICU+JSANCiAgbXV0YXRlKCBwcmVjaW9fY3J1ZG9fbWVfcGVzb3NfYmJsID0gIHByZWNpb19jcnVkb19tZV91c2RfYmJsICpUQ0MsDQogICAgICAgICAgcHJlY2lvX2NydWRvX21pX3Blc29zX2JibCA9ICBwcmVjaW9fY3J1ZG9fbWlfdXNkX2JibCAqVENDKQ0KDQoNCiMjIEJhc2UgcmVnYWxpYXMNCnByZWNpb19taV9yZWdhbGlhc19jcnVkbyA8LSByZWFkX2RlbGltKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JlZ2FsaWFzL3ByZWNpb19tZXJjYWRvX2ludGVybm9fY3J1ZG9fcmVnYWxpYXMuY3N2IiwgDQogICAgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUNCiAgcmVuYW1lKGFuaW8gPSAiQcORTyIsDQogICAgICAgICBtZXMgPSAiTUVTIiwNCiAgICAgICAgIHRvdGFsX3RpcG9fY3J1ZG8gPSAiVE9UQUwgVElQTyBERSBDUlVETyIpICU+JSANCiAgICBtdXRhdGUodW5pZGFkID0gIlVTRC9tMyIsDQogICAgICAgICBhbmlvID0gbmEubG9jZihhbmlvKSkgJT4lICANCiAgc2VsZWN0KGFuaW8sIG1lcywgdW5pZGFkLCB0b3RhbF90aXBvX2NydWRvLCBldmVyeXRoaW5nKC4pLCAtYyhCUkVOVCwgV1RJKSkgJT4lIA0KICBnYXRoZXIoLiwNCiAgICAgICAgIGtleSA9ICJ0aXBvX2NydWRvIiwNCiAgICAgICAgIHZhbHVlID0gInZhbG9yIiwNCiAgICAgICAgIDU6bmNvbCguKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQpICU+JQ0KICBzdW1tYXJpc2UocHJlY2lvX21pX3JlZ2FsaWFzX2NydWRvID0gbWVhbih0b3RhbF90aXBvX2NydWRvKSwNCiAgICAgICAgICAgIHByZWNpb19wcm9tZWRpb190aXBvX2NydWRvID0gbWVhbih2YWxvcikpICU+JSANCiAgbXV0YXRlKHRpcG9fcHJlY2lvID0gIm1lcmNhZG8gaW50ZXJubyIpDQoNCiMgUmV2aXN0YSBJREVFDQojIHByZWNpb3MgaW50ZXJub3MgdnMgcHJlY2lvIHByb21lZGlvIGludGVybm8gZGUgZWV1dSB2cyBwcmVjaW8gYXJhYmFpIHNhdWRpdGEuIGN1YWRybyAzLjEuMy4xIHAuMTcwDQpwcmVjaW9fbWlfdnNfaW50ZXJuYWNpb25hbF9pZGVlX2NydWRvIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmV2aXN0YXMgUG9sw610aWNhcyBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnaWEgZW4gQXJnIDE5NzAtMTk4OC9QcmVjaW9zIGRlbCBwZXRyb2xlbyBjcnVkbyB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OS54bHN4IiwgDQogICAgc2tpcCA9IDEsIHNoZWV0ID0gNCkNCg0KDQojbWVyZ2UNCnByZWNpb19taV9jcnVkbyA8LSBwcmVjaW9fbWlfcmVnYWxpYXNfY3J1ZG8gJT4lICANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX21pX3JlZ2FsaWFzX2NydWRvKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9fbWlfbWVjb25fY3J1ZG8gKSAlPiUgDQogIGZ1bGxfam9pbih2dGFzX3ByZWNpb19tZW1vX3lwZl9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgIHByZWNpb19taV95cGZfY3J1ZG8gKSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX21pX3ZzX2ludGVybmFjaW9uYWxfaWRlZV9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBwcmVjaW9fbWlfaWRlZV9jcnVkbyA9IHByZWNpb19jcnVkb19uZXVxdWluYV90Y19vZmljaWFsICkpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJVU0QvbTMiKSAlPiUgDQogIG11dGF0ZV9hdCgudmFycyA9IGMoInByZWNpb19taV9yZWdhbGlhc19jcnVkbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICJwcmVjaW9fbWlfbWVjb25fY3J1ZG8iLCAicHJlY2lvX21pX3lwZl9jcnVkbyIsICJwcmVjaW9fbWlfaWRlZV9jcnVkbyIpLCANCiAgICAgICAgICAgIC5mdW5zID0gY29udmVyc29yX20zYmJsX3ApICU+JSANCiAgbGVmdF9qb2luKHByZWNpb3NfbWVjb24gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcHJlY2lvX21pX21lY29uX2Njbm5fY3J1ZG8gPSBwcmVjaW9fY3J1ZG9fbWlfdXNkX2JibCApKSAlPiUgDQogIGxlZnRfam9pbihpcGltX2Jhc2U5NCAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBpcGltX25pdmVsX2dyYWxfOTQpLCBieSA9ICJhbmlvIikgJT4lIA0KICByZW5hbWUocmVnYWxpYXMgPSBwcmVjaW9fbWlfcmVnYWxpYXNfY3J1ZG8sDQogICAgICAgICBtZWNvbiA9IHByZWNpb19taV9tZWNvbl9jcnVkbywNCiAgICAgICAgIHlwZiA9IHByZWNpb19taV95cGZfY3J1ZG8sDQogICAgICAgICBpZGVlID0gcHJlY2lvX21pX2lkZWVfY3J1ZG8sDQogICAgICAgICBtZWNvbl9jY25uID0gcHJlY2lvX21pX21lY29uX2Njbm5fY3J1ZG8pICU+JSANCiAgYXJyYW5nZShhbmlvKSAlPiUgDQogIHVuZ3JvdXAoKQ0KcHJlY2lvX21pX2NydWRvIDwtICBwcmVjaW9fbWlfY3J1ZG8gJT4lIA0KICBtdXRhdGUoIHVuaWRhZCA9ICJVU0QvYmFycmlsZXMiLA0KICAgICAgICAgICB2YXJpYWJsZSA9ICAiUHJlY2lvIGRlbCBtZXJjYWRvIGludGVybm8gZGVsIHBldHLDs2xlbyBjcnVkbyBzZWfDum4gZGlzdGludGFzIGZ1ZW50ZXMiLA0KICAgICAgICAgIG1lY29uX2VzdGltYWRvID0gcHJlY2lvX21pX2NydWRvJG1lY29uW3ByZWNpb19taV9jcnVkbyRhbmlvPT0xOTk0XSppcGltX25pdmVsX2dyYWxfOTQsDQogICAgICAgICAgaW5kaWNlX3lwZl83MiA9IGdlbmVyYXJfaW5kaWNlKHNlcmllID0geXBmLCBmZWNoYSA9IGFuaW8sIGZlY2hhX2Jhc2UgPSAxOTcyKSwNCiAgICAgICAgIGlkZWVfZXN0aW1hZG8gPSBwcmVjaW9fbWlfY3J1ZG8kaWRlZVtwcmVjaW9fbWlfY3J1ZG8kYW5pbz09MTk3Ml0gKiBpbmRpY2VfeXBmXzcyLA0KICAgICAgICAgcHJlY2lvX2NydWRvX21kb2ludCA9ICAgY2FzZV93aGVuKA0KICAgICAgICAgICAgICAgIGFuaW8gJWluJSAxOTYzOjE5NjUgfiBpZGVlX2VzdGltYWRvLA0KICAgICAgICAgICAgICAgIGFuaW8gJWluJSAxOTY2OjE5ODggfiBpZGVlLA0KICAgICAgICAgICAgICAgIGFuaW8gJWluJSAxOTg5OjE5OTEgfiB5cGYsDQogICAgICAgICAgICAgICAgYW5pbyA9PSAxOTkyIH4gbWVjb25fZXN0aW1hZG8sDQogICAgICAgICAgICAgICAgYW5pbyA+MTk5MiB+IG1lY29uKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCB2YXJpYWJsZSwgcHJlY2lvX2NydWRvX21kb2ludCAsIGV2ZXJ5dGhpbmcoLiksIA0KICAgICAgICAgLWMoaXBpbV9uaXZlbF9ncmFsXzk0LCBpZGVlX2VzdGltYWRvLG1lY29uX2VzdGltYWRvLGluZGljZV95cGZfNzIsaWRlZV9lc3RpbWFkbyApKSAlPiUgDQogIGZpbHRlcihhbmlvIDwgMjAyMSkNCg0KICANCiAgDQojIHdyaXRleGw6OndyaXRlX3hsc3gocHJlY2lvX21pX2NydWRvLCBwYXRoID0gInJlc3VsdGFkb3MvcHJlY2lvX21pX2NydWRvLnhsc3giKQ0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gocHJlY2lvX21pX3ZzX2ludGVybmFjaW9uYWxfaWRlZV9jcnVkbyAlPiUgDQojICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgIHByZWNpb19jcnVkb19uZXVxdWluYV90Y19vZmljaWFsICkgJT4lIA0KIyAgICAgICAgICAgICAgICAgICAgICAgc3ByZWFkKC4sDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gYW5pbywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHByZWNpb19jcnVkb19uZXVxdWluYV90Y19vZmljaWFsKSAlPiUgDQojICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUodmFyaWFibGUgPSAicHJlY2lvX2NydWRvX25ldXF1aW5hX3RjX29maWNpYWwgZW4gVVNEL20zIikgJT4lDQojICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QodmFyaWFibGUsIGV2ZXJ5dGhpbmcoLikpLA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicHJlY2lvX21pX3ZzX2ludGVybmFjaW9uYWxfaWRlZV9jcnVkby54bHN4IikNCmBgYA0KDQo8YnI+DQoqKlRhYmxhIDMuIFByZWNpbyBkZWwgbWVyY2FkbyBpbnRlcm5vIGRlbCBwZXRyw7NsZW8gY3J1ZG8gZW4gQXJnZW50aW5hIHNlZ8O6biBkaXN0aW50YXMgZnVlbnRlcyAoYmFycmlsZXMpKioNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwcmVjaW9fbWlfY3J1ZG8gJT4lIA0KICBzZWxlY3QoLXByZWNpb19jcnVkb19tZG9pbnQpDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3RseShwcmVjaW9fbWlfY3J1ZG8gJT4lIA0KICAgICAgc2VsZWN0KC1wcmVjaW9fY3J1ZG9fbWRvaW50KSAlPiUgDQogICAgICBtdXRhdGUocmVnYWxpYXMgPSANCiAgICAgICAgICAgICAgIGNhc2Vfd2hlbihyZWdhbGlhcyA9PSAwIH4gTkFfcmVhbF8sDQogICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiByZWdhbGlhcykpICU+JSANCiAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLCB2YWx1ZSA9IHZhbG9yLCA0Om5jb2woLikpICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSB2YXJpYWJsZSwgc2hhcGUgPSB2YXJpYWJsZSkpKw0KICBnZW9tX2xpbmUoYWxwaGEgPSAwLjgpKw0KICBsYWJzKHRpdGxlID0gIkdyw6FmaWNvIDMuIFByZWNpb3MgZGVsIG1lcmNhZG8gaW50ZXJubyBkZWwgcGV0csOzbGVvIGNydWRvLg0KICAgICAgIEFyZ2VudGluYSAoMTk2MyAtIDIwMjApIiwNCiAgICAgICB5ID0gIlVTRC9iYXJyaWwiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQ0KICAgICAgICAgICAgICAgICAgICAgDQpgYGANCg0KDQojIyMjIFByZWNpbyBNZXJjYWRvIEludGVybm8gZGUgR2FzIE5hdHVyYWwNCiogUHJlY2lvIE1lcmNhZG8gSW50ZXJubyBkZSBnYXM6DQogICsgMTk2MyAtIDE5NjkgJiAxOTg5IC0gMTk5MjogQW51YXJpbyBkZSBZUEYNCiAgKyAxOTcwIC0gMTk4ODogIEtvenVsaiB5IFBpc3RvbmVzaSAtIFJldmlzdGEgSURFRQ0KICArIDE5OTMgZW4gYWRlbGFudGU6IFNlY3JldGFyw61hIGRlIEVuZXJnw61hIC0gQmFzZSBSZWdhbMOtYXMNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI0FudWFyaW8gWVBGDQp2dGFzX3ByZWNpb19tZW1vX3lwZl9nYXMgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NZW1vcmlhIFlQRi92dGFzX3ZhbG9yX2NhbnRpZGFkX3ByZWNpb19nYXMueGxzeCIpICU+JSANCiAgICByZW5hbWUoY2FudF92ZW5kaWRhZCA9ICJtMyIsIHZhbG9yX3ZlbmRpZG8gPSAiJCIsIG1vbmVkYSA9ICJNb25lZGEiKSAlPiUgDQogIGxlZnRfam9pbih2dGFzX3ByZWNpb19tZW1vX3lwZl9jcnVkbyAlPiUgc2VsZWN0KGFuaW8sIG1vbmVkYSwgdGNjX2RpYyApKSAlPiUgDQogIG11dGF0ZShwcmVjaW9fbWlfeXBmX2dhc19tb25lZGFfb3JpZ2luYWwgPSAodmFsb3JfdmVuZGlkby9jYW50X3ZlbmRpZGFkKSAvIDEwMDAsDQogICAgICAgICBwcmVjaW9fbWlfdXNkX3lwZl9nYXMgPSBwcmVjaW9fbWlfeXBmX2dhc19tb25lZGFfb3JpZ2luYWwgLyB0Y2NfZGljLA0KICAgICAgICAgcHJlY2lvX21pX3lwZl9nYXMgPSBjYXNlX3doZW4oICNob21vZ2VuaXphbW9zIGxvcyBjYW1iaW9zIGRlIG1vbmVkYQ0KICAgICAgICAgICBtb25lZGEgPT0gIm0kbiIgfiBwcmVjaW9fbWlfeXBmX2dhc19tb25lZGFfb3JpZ2luYWwvY29udmVyc29yX3Blc29zJGBtJG5gICwNCiAgICAgICAgICAgbW9uZWRhID09ICIkbGV5IiB+IHByZWNpb19taV95cGZfZ2FzX21vbmVkYV9vcmlnaW5hbC9jb252ZXJzb3JfcGVzb3MkYCRMZXlgLCANCiAgICAgICAgICAgbW9uZWRhID09ICIkYXJnIiB+IHByZWNpb19taV95cGZfZ2FzX21vbmVkYV9vcmlnaW5hbC9jb252ZXJzb3JfcGVzb3MkYCRhYCwgDQogICAgICAgICAgIG1vbmVkYSA9PSAiQSIgfiBwcmVjaW9fbWlfeXBmX2dhc19tb25lZGFfb3JpZ2luYWwvY29udmVyc29yX3Blc29zJEEsDQogICAgICAgICAgIFQgfiBwcmVjaW9fbWlfeXBmX2dhc19tb25lZGFfb3JpZ2luYWwpLA0KICAgICAgICAgbW9uZWRhID0gImFycyIsDQogICAgICAgICB1bmlkYWQgPSAiYXJzL01pbGVzIGRlIG0zIikgJT4lICNhY2xhcmFtb3MgbGEgdW5pZGFkIG1vbmV0YXJpYSB5YSB0cmFuc2Zvcm1hZGENCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgbW9uZWRhLCB2YWxvcl92ZW5kaWRvLCBjYW50X3ZlbmRpZGFkLCANCiAgICAgICAgIHByZWNpb19taV95cGZfZ2FzLHByZWNpb19taV95cGZfZ2FzX21vbmVkYV9vcmlnaW5hbCwgdGNjX2RpYywgcHJlY2lvX21pX3VzZF95cGZfZ2FzKQ0KDQojQW51YXJpbyBDb21idXN0aWJsZQ0KYW51YXJpb19kZV9jb21idXN0aWJsZSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0FudWFyaW8gQ29tYnVzdGlibGVzL2FudWFyaW8gZGUgY29tYnVzdGlibGUueGxzeCIpICU+JSANCiAgZmlsdGVyKG1lcmNhbmNpYSA9PSAiZ2FzX25hdHVyYWwiKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8gLCAgICAgbWVzLCAgICAgIHVuaWRhZCApICU+JSANCiAgc3VtbWFyaXNlKHByZWNpb19taV9hbnVhcmlvX2dhcyA9IG1lYW4odmFsb3IpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8gLCAgICAgICB1bmlkYWQgKSAlPiUgDQogIHN1bW1hcmlzZShwcmVjaW9fbWlfYW51YXJpb19nYXMgPSBtZWFuKHByZWNpb19taV9hbnVhcmlvX2dhcykpICU+JSANCiAgbXV0YXRlKHByZWNpb19taV9hbnVhcmlvX2dhcyA9IChwcmVjaW9fbWlfYW51YXJpb19nYXMvY29udmVyc29yX3Blc29zJEEpLzEwMDAsDQogICAgICAgICB1bmlkYWQgPSAiYXJzL01pbGVzIGRlIG0zIikNCg0KIyBCYXNlIE1FQ09ODQpwcmVjaW9zX2ludGVybm9zX21lY29uX2dhcyA8LSBoaWRyb2NhcmJ1cm9zX2Jhc2VfbWVjb24gJT4lIA0KICBmaWx0ZXIoaW5kaWNhZG9yID09IGxpc3RhX2ZpbHRyb1syXSwgDQogICAgICAgICBhY3RpdmlkYWRfcHJvZHVjdG9fbm9tYnJlID09ICJHYXMgbmF0dXJhbCIsDQogICAgICAgICBhbGNhbmNlX3RpcG8gPT0gIlBBSVMiKSAlPiUNCiAgbXV0YXRlKGFuaW8gPSB5ZWFyKGZlY2hhKSkgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShwcmVjaW9fbWlfbWVjb25fZ2FzID0gbWVhbih2YWxvcikpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJhcnMvTWlsZXMgZGUgbTMiKQ0KDQoNCiMjIEJhc2UgcmVnYWxpYXMNCiN2YWxvcmVzIDkzIC0gOTgNCnByZWNpb19yZWdhbGlhc190b3RhbF9nYXMgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9QcmVjaW9zL3ByZWNpb19taV9nYXMueGxzeCIsDQogICAgc2hlZXQgPSAiamsiKSAlPiUgDQogIGZpbHRlcihhbmlvIDwgMTk5OSkgJT4lIA0KICBtdXRhdGUocHJlY2lvX3RvdGFsX2dhcyA9IHByZWNpb19taV9nYXMgKiAxMDAwLA0KICAgICAgICAgdW5pZGFkID0gImFycy9NaWxlcyBkZSBtMyIpICU+JSANCiAgc2VsZWN0KC1wcmVjaW9fbWlfZ2FzKQ0KDQojdmFsb3JlcyBwb3N0IDk5DQpwcmVjaW9fcmVnYWxpYXNfbWlfZ2FzIDwtIHJlYWRfZGVsaW0oIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmVnYWxpYXMvcHJlY2lvX21lcmNhZG9faW50ZXJub19nYXNfcmVnYWxpYXMuY3N2IiwgDQogICAgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUNCiAgcmVuYW1lKGFuaW8gPSAiQcORTyIsDQogICAgICAgICBtZXMgPSAiTUVTIiwNCiAgICAgICAgIHRvdGFsX2N1ZW5jYSA9ICJUT1RBTCBDVUVOQ0EiKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiYXJzL01pbGVzIGRlIG0zIiwNCiAgICAgICAgIGFuaW8gPSBuYS5sb2NmKGFuaW8pKSAlPiUgDQogIHNlbGVjdChhbmlvLCBtZXMsIHVuaWRhZCwgIGV2ZXJ5dGhpbmcoLikpICU+JSANCiAgZ2F0aGVyKC4sDQogICAgICAgICBrZXkgPSAiY3VlbmNhIiwNCiAgICAgICAgIHZhbHVlID0gInZhbG9yIiwNCiAgICAgICAgIDQ6bmNvbCguKSkgJT4lIA0KICBtdXRhdGUodmFsb3IgPSBnc3ViKCIsIiwgIiIsIHZhbG9yKSwNCiAgICAgICAgIHZhbG9yID0gYXMuZG91YmxlKHZhbG9yKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQsIGN1ZW5jYSkgJT4lIA0KICBzdW1tYXJpc2UocHJlY2lvX3Byb21lZGlvX2N1ZW5jYSA9IG1lYW4odmFsb3IpKSU+JSANCiAgbXV0YXRlKHRpcG9fcHJlY2lvID0gIm1lcmNhZG8gaW50ZXJubyIpICU+JSANCiAgZmlsdGVyKGN1ZW5jYSA9PSAidG90YWxfY3VlbmNhIiklPiUgICNxdWl0byBwcmVjaW8gcHJvbWVkaW8gZWxhYm9yYWRvIHBxIG5vIHNlIHVzYXLDoQ0KICBsZWZ0X2pvaW4ocHJlY2lvX3JlZ2FsaWFzX3RvdGFsX2dhcykgJT4lIA0KICBtdXRhdGUocHJlY2lvX21pX3JlZ2FsaWFzX2dhcyA9IGNhc2Vfd2hlbihhbmlvIDwgMTk5OSB+IHByZWNpb190b3RhbF9nYXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBwcmVjaW9fcHJvbWVkaW9fY3VlbmNhKSkgJT4lIA0KICBzZWxlY3QoLWMocHJlY2lvX3RvdGFsX2dhcywgcHJlY2lvX3Byb21lZGlvX2N1ZW5jYSkpDQoNCiNSZXZpc3RhIElERUUNCiNwcmVjaW8gdHJhbnNmZXJlbmNpYSwgcmVnYWxpYXMsIGNvbXBlbnNhY2lvbmVzLCBldGMgcHJvbWVkaW8gYW51YWwNCnByZWNpb19taV9pZGVlX2dhcyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JldmlzdGFzIFBvbMOtdGljYXMgZGUgUHJlY2lvcyBkZSBsYSBFbmVyZ2lhIGVuIEFyZyAxOTcwLTE5ODgvUHJlY2lvcyBkZWwgZ2FzIG5hdHVyYWwgeSBkZXJpdmFkb3MgMTk3MCAtIDE5ODgueGxzeCIsIA0KICAgIHNraXAgPSAxLCBzaGVldCA9IDIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX3RyYW5zZmVyZW5jaWEpICU+JSANCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY183MCkpICU+JQ0KICBtdXRhdGUocHJlY2lvX21pX2luZGV4YWRvX3Blc29zID0gcHJlY2lvX3RyYW5zZmVyZW5jaWEgKiBpcGNfNzAgLyBjb252ZXJzb3JfcGVzb3MkYCRMZXlgKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWxfYiAlPiUgc2VsZWN0KGFuaW8sIHRjYykgKSAlPiUgDQogIG11dGF0ZShwcmVjaW9fbWlfaW5kZXhhZG9fdXNkID0gcHJlY2lvX21pX2luZGV4YWRvX3Blc29zL3RjYyApICANCiAgIyBzZWxlY3QoLWModW5pZGFkLCBwcmVjaW9fdHJhbnNmZXJlbmNpYSkpDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChwcmVjaW9fbWlfaWRlZV9nYXMsIHBhdGggPSAicHJlY2lvX21pX2lkZWVfZ2FzLnhsc3giKQ0KDQojY29udmVyc29yIGRlIG1vbmVkYSANCiMgJT4lIA0KIyAgIG11dGF0ZShwcmVjaW9fdHJhbnNmZXJlbmNpYSA9IGNhc2Vfd2hlbigNCiMgICAgIGFuaW8gPCAxOTgzIH4gcHJlY2lvX3RyYW5zZmVyZW5jaWEvY29udmVyc29yX3Blc29zJGAkTGV5YCwNCiMgICAgIGFuaW8gPT0gMTk4MyB+IHByZWNpb190cmFuc2ZlcmVuY2lhIC8gY29udmVyc29yX3Blc29zJGAkYWAsDQojICAgICBhbmlvICVpbiUgMTk4MzoxOTkxIH4gcHJlY2lvX3RyYW5zZmVyZW5jaWEvY29udmVyc29yX3Blc29zJEEpKQ0KDQojTWVyZ2UNCnByZWNpb19taV9nYXMgPC0gcHJlY2lvX3JlZ2FsaWFzX21pX2dhcyAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19taV9yZWdhbGlhc19nYXMpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb3NfaW50ZXJub3NfbWVjb25fZ2FzKSAlPiUgDQogIGZ1bGxfam9pbih2dGFzX3ByZWNpb19tZW1vX3lwZl9nYXMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLCAgcHJlY2lvX21pX3lwZl9nYXMgKSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX21pX2lkZWVfZ2FzICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgIHByZWNpb19taV9pZGVlX2luZGV4YWRvID0gcHJlY2lvX21pX2luZGV4YWRvX3Blc29zKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHJlY2lvX21pX2lkZWVfY3Rlc19wZXNvcyA9IHByZWNpb190cmFuc2ZlcmVuY2lhKSkgJT4lIA0KICBsZWZ0X2pvaW4oYW51YXJpb19kZV9jb21idXN0aWJsZSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvc19tZWNvbiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvICwgcHJlY2lvX21pX21lY29uX2Njbm5fZ2FzID0gcHJlY2lvX2dhc19taV9wZXNvc19NbTMpKSAlPiUgDQogICMgbXV0YXRlKHByZWNpb19nYXNfbWRvaW50ID0gY2FzZV93aGVuKGFuaW8gPCAxOTg4IH4gcHJlY2lvX21pX3lwZl9nYXMsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA9PSAxOTg4IH4gIHByZWNpb19taV9pZGVlX2luZGV4YWRvLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gJWluJSAxOTg5OjE5OTEgIH4gcHJlY2lvX21pX3lwZl9nYXMsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA9PSAxOTkyICB+IHByZWNpb19taV95cGZfZ2FzLzEwLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPiAxOTkyIH4gcHJlY2lvX21pX3JlZ2FsaWFzX2dhcyksDQogICMgICAgICAgIGRpZl95cGZfaWRlZSA9IHByZWNpb19taV95cGZfZ2FzL3ByZWNpb19taV9pZGVlX2luZGV4YWRvLTEgKSAlPiUNCiAgbXV0YXRlKHZhcmlhYmxlID0gIlByZWNpbyBkZWwgbWVyY2FkbyBpbnRlcm5vIGRlbCBnYXMgbmF0dXJhbCBzZWfDum4gZGlzdGludGFzIGZ1ZW50ZXMiLA0KICAgICAgICAgcHJlY2lvX2dhc19tZG9pbnQgPSBjYXNlX3doZW4oYW5pbyAlaW4lIDE5NjM6MTk2OXxhbmlvICVpbiUgMTk4OToxOTkxIH4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9fbWlfeXBmX2dhcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gJWluJSAxOTcwOjE5ODggfiBwcmVjaW9fbWlfaWRlZV9pbmRleGFkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA9PSAxOTkyICB+IHByZWNpb19taV95cGZfZ2FzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID4gMTk5MiB+IHByZWNpb19taV9yZWdhbGlhc19nYXMpICkgJT4lIA0KICBhcnJhbmdlKGFuaW8pICU+JQ0KICBzZWxlY3QoYW5pbywgdW5pZGFkLHZhcmlhYmxlLCBwcmVjaW9fZ2FzX21kb2ludCwgZXZlcnl0aGluZyguKSApICU+JSANCiAgcmVuYW1lKHJlZ2FsaWFzID0gcHJlY2lvX21pX3JlZ2FsaWFzX2dhcywNCiAgICAgICAgIG1lY29uID0gcHJlY2lvX21pX21lY29uX2dhcywNCiAgICAgICAgIHlwZiA9IHByZWNpb19taV95cGZfZ2FzLA0KICAgICAgICAgaWRlZSA9IHByZWNpb19taV9pZGVlX2luZGV4YWRvLA0KICAgICAgICAgbWVjb25fY2NubiA9IHByZWNpb19taV9tZWNvbl9jY25uX2dhcywNCiAgICAgICAgIGFudWFyaW8gPSBwcmVjaW9fbWlfYW51YXJpb19nYXMpICU+JSANCiAgZmlsdGVyKGFuaW8gPCAyMDIxKQ0KDQojcHJlY2lvIGludGVybm8gZW4gTU1CVFUgcGVzb3MNCnByZWNpb19taV9nYXNfTU1CVFUgPC0gIHByZWNpb19taV9nYXMgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHNlbGVjdCgtYyh1bmlkYWQsIHZhcmlhYmxlKSkgJT4lIA0KICBtdXRhdGVfYWxsKCBmdW5jdGlvbih4KSB7Y29udmVyc29yX20zTU1CVFVfcCh4LzEwMDApfSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gImFycy9NTUJUVSIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSkNCg0KI3ByZWNpbyBpbnRlcm5vIGVuIE1NQlRVIHVzZA0KcHJlY2lvX2ludGVybm9fZ2FzX21tYnR1X3VzZCA8LSBwcmVjaW9fbWlfZ2FzX01NQlRVICU+JQ0KICAjIHNlbGVjdCgtZGlmX3lwZl9pZGVlKSAlPiUgDQogIGdhdGhlcihrZXkgPSB0aXBvX3ByZWNpbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAzOm5jb2woLikpICU+JQ0KIGxlZnRfam9pbih0Y3BfYW51YWxfYiwgYnkgPSAiYW5pbyIpICU+JQ0KICBtdXRhdGUodmFsb3IgPSB2YWxvci8gdGNjLA0KICAgICAgICAgdW5pZGFkID0gIlVTRC9NTUJUVSIpICU+JSANCiAgc2VsZWN0KC1jKHRjYyx0Y3AsIHNvYnJldmFsdWFjaW9uKSkgJT4lIA0KICBzcHJlYWQoa2V5ID0gdGlwb19wcmVjaW8sDQogICAgICAgICB2YWx1ZSA9IHZhbG9yKQ0KDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChwcmVjaW9fbWlfZ2FzLCBwYXRoID0gInJlc3VsdGFkb3MvcHJlY2lvX21pX2dhcy54bHN4IikNCg0KI3ByZWNpbyByZXZpc3RhIHRyYW5zcHVlc3RvDQojIHdyaXRleGw6OndyaXRlX3hsc3gocHJlY2lvX21pX2lkZWVfZ2FzICU+JSANCiMgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgcHJlY2lvX3RyYW5zZmVyZW5jaWFfeXBmX2FfR0UgPXByZWNpb190cmFuc2ZlcmVuY2lhICkgJT4lIA0KIyAgICAgICAgICAgICAgICAgICAgICAgc3ByZWFkKC4sDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gYW5pbywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHByZWNpb190cmFuc2ZlcmVuY2lhX3lwZl9hX0dFKSAlPiUgDQojICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUodmFyaWFibGUgPSAicHJlY2lvX3RyYW5zZmVyZW5jaWFfeXBmX2FfR0UgZW4gcGVzb3MgZGUgMTk3MC8xMDAwIG0zIikgJT4lDQojICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QodmFyaWFibGUsIGV2ZXJ5dGhpbmcoLikpLA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicHJlY2lvX21pX2lkZWVfZ2FzLnhsc3giKQ0KDQojIGdyYWZfbWlfZ2FzIDwtIHByZWNpb19taV9pZGVlX2dhcyAlPiUgDQojICAgc2VsZWN0KGFuaW8sIHByZWNpb19taV9pbmRleGFkb19wZXNvcywgcHJlY2lvX21pX2luZGV4YWRvX3VzZCkgJT4lIA0KIyAgIGdhdGhlciguLA0KIyAgICAgICAgICBrZXkgPSB2YXJpYWJsZSAsDQojICAgICAgICAgIHZhbHVlID0gdmFsb3IsDQojICAgICAgICAgIDI6MykgJT4lDQojICAgZmlsdGVyKHZhcmlhYmxlID09InByZWNpb19taV9pbmRleGFkb191c2QiICkgJT4lIA0KIyAgIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gdmFyaWFibGUpKSsNCiMgICBnZW9tX2xpbmUoKQ0KIyBncmFmX21pX2dhcw0KDQojIHByZWNpb19taV9nYXMgJT4lIA0KIyAgIGZpbHRlcihhbmlvID4gMjAwMCkgJT4lIA0KIyAgIHNlbGVjdChhbmlvLCBwcmVjaW9fZ2FzX21kb2ludCwgcHJlY2lvX21pX21lY29uX2Njbm5fZ2FzKQ0KYGBgDQoNCjxicj4NCioqVGFibGEgNC4gUHJlY2lvIGRlbCBtZXJjYWRvIGludGVybm8gZGVsIGdhcyBuYXR1cmFsIGVuIEFyZ2VudGluYSBzZWfDum4gZGlzdGludGFzIGZ1ZW50ZXMgKGJhcnJpbGVzKSoqDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcHJlY2lvX21pX2dhcyAlPiUgDQogIHNlbGVjdCgtcHJlY2lvX2dhc19tZG9pbnQpDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ3JhZl9wcmVjaW9faW50ZXJub19nYXNfbW1idHUgPC0gcHJlY2lvX21pX2dhc19NTUJUVSAlPiUNCiAgIyBzZWxlY3QoLWMoZGlmX3lwZl9pZGVlLCBwcmVjaW9fZ2FzX21kb2ludCkpICU+JSANCiAgc2VsZWN0KC1jKCBwcmVjaW9fZ2FzX21kb2ludCkpICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fcHJlY2lvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDM6bmNvbCguKSkgJT4lDQogbGVmdF9qb2luKHRjcF9hbnVhbF9iLCBieSA9ICJhbmlvIikgJT4lDQogIG11dGF0ZSh2YWxvciA9IHZhbG9yLyB0Y2MpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBhbmlvLCB5ID0gdmFsb3IsIGNvbG9yID0gdGlwb19wcmVjaW8pKSsNCiAgZ2VvbV9saW5lKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogICMgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsNCiAgbGFicyh0aXRsZSA9ICJHcsOhZmljbyBOwrA0LiBQcmVjaW8gZGVsIG1lcmNhZG8gaW50ZXJubyBkZWwgZ2FzIG5hdHVyYWwuDQogICAgICAgQXJnZW50aW5hICgxOTYzIC0gMjAxOCkiLCANCiAgICAgICB5ID0gIlVTRC9NTUJUVSIpDQpnZ3Bsb3RseShncmFmX3ByZWNpb19pbnRlcm5vX2dhc19tbWJ0dSwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDYwMCkNCmBgYA0KDQoNCiMjIFByZWNpb3MgZGUgUmVmZXJlbmNpYSBkZWwgTWVyY2FkbyBNdW5kaWFsDQpQcmVjaW9zIGRlIGV4cG9ydGFjacOzbiBkZXNkZSBBcmdlbnRpbmEsIGJlbmNobWFya3MgeSBQcmVjaW9zIGRlbCBtZXJjYWRvIGRlIEVFVVUgKHNvbG8gZ2FzLCBpbnRlcm5vcyB5IGRlIGV4cG8vaW1wbykNCg0KKiBbU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEtUmVnYWxpYXNdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9yZWdhbGlhcy1kZS1wZXRyb2xlby1jcnVkby1nYXMtbmF0dXJhbC1nbHAtZ2Fzb2xpbmEteS1jb25kZW5zYWRvKSkgKDIwMDYtaG95KQ0KKiBbTUVDT05dKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9wcmVjaW8tZGUtZXhwb3J0YWNpb24tZGUtcGV0cm9sZW8tY3J1ZG8pLiBTZXJpZSBjb3J0YSB5IHNpbiB0cmFuc2Zvcm1hY2lvbmVzDQoqIEVJQQ0KICArIFtCcmVudF0oaHR0cHM6Ly93d3cuZWlhLmdvdi9kbmF2L3BldC9oaXN0L1JCUlRFRC5odG0pICgxOTg3LWhveSkNCiAgKyBbV1RJXShodHRwczovL3d3dy5laWEuZ292L2RuYXYvcGV0L2hpc3Qvcnd0Y0QuaHRtKSAoMTk4Ni1ob3kpDQogICsgW0hlbnJ5IEh1Yl0oaHR0cHM6Ly93d3cuZWlhLmdvdi9kbmF2L25nL2hpc3Qvcm5nd2hoZGQuaHRtKSAoMTk5Ny1ob3kpDQogICsgW1ByZWNpbyBHYXMgZGUgQm9jYSBkZSBQb3pvIGVuIEVFVVVdKGh0dHBzOi8vd3d3LmVpYS5nb3YvZG5hdi9uZy9oaXN0L245MTkwdXMzQS5odG0pDQoqIFtJbmZsYXRpb24gRGF0YV0oaHR0cHM6Ly9pbmZsYXRpb25kYXRhLmNvbS9hcnRpY2xlcy9pbmZsYXRpb24tYWRqdXN0ZWQtcHJpY2VzL2hpc3RvcmljYWwtY3J1ZGUtb2lsLXByaWNlcy10YWJsZS8pICgxOTQ2LWhveSkNCiogW0V1cm9zdGF0XShodHRwczovL2VjLmV1cm9wYS5ldS9ldXJvc3RhdC93ZWIvZW5lcmd5L2RhdGEvZGF0YWJhc2UpDQoqIFJldmlzdGEgSURFRSAgIA0KICArIFByZWNpbyBkZSBJbXBvcnRhY2nDs24gZGUgZ2FzIG5hdHVyYWwgZGVzZGUgQm9saXZpYSAoMTk3MC0xOTg4KQ0KKiBbVU4gQ29tdHJhZGVdKGh0dHBzOi8vY29tdHJhZGUudW4ub3JnL2RhdGEvKQ0KICArIFByZWNpbyBkZSBFeHBvcnRhY2nDs24gZSBJbXBvcnRhY2nDs24gZGUgZ2FzIHkgY3J1ZG8gKGEgQm9saXZpYSB5IHByb21lZGlvIG11bmRpYWwpDQogICsgRWwgcHJlY2lvIGltcG8gYm9saXZpYSBkZSAgVU4gQ29tdHJhZGUgY2llcnJhLCBkYSB2YWxvcmVzIGNvaGVyZW50ZXMgcGVybyBubyBkZWJlcmlhLCBkYWRvIHF1ZSBsYSBjb252ZXJzacOzbiBkZWJlcmlhIHJlYWxpemFyc2UgbXVsdGlwbGljYW5kbyBlbCBwcmVjaW8gZW4gTW0zIHBvciAxMDAwIHkgYWjDrSByZWNpw6luIHJlYWxpemFyIGxhIGNvbnZlcnNpw7NuDQogIA0KDQojIyMjIFByZWNpb3MgZGUgUmVmZXJlbmNpYSBkZWwgQ3J1ZG8NCiogRnVlbnRlcyBzZWxlY2Npb25hZGFzIHBhcmEgcHJlY2lvX21lX2NydWRvOiANCiAgKyBlbnRyZSAxOTYyIHkgMTk5MjogcHJlY2lvIGRlIGV4cG9ydGFjacOzbiBhcmdlbnRpbmEgZGUgVU4gQ29tdHJhZGUgKGNsYXNpZmljYWNpw7NuIFNJVEMgYXMgcmVwb3J0ZWQpDQogICsgZW50cmUgMTk5My0yMDAxIHkgMjAwNC0yMDE0OiBwcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGFyZ2VudGluYSBkZSBNZWNvbg0KICArIGVudHJlIDIwMDIgeSAyMDAzOiBwcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGRlIEFyZ2VudGluYSBkZSBVTiBDb210cmFkZSAoQ2xhc2lmaWNhY2nDs24gSFMgYXMgcmVwb3J0ZWQpDQogICsgMjAxNCBlbiBhZGVsYW50ZTogcHJlY2lvIGRlIGV4cG9ydGFjacOzbiBhcmdlbnRpbmEgZGUgU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgKFJlZ2Fsw61hcykNCiAgKyBWYWxvcmVzIGZhbHRhbnRlcyBwcmV2aW9zIGEgMTk5MiAoMTk3MCAtIDE5ODUpOiBCcmVudCAoRnVlbnRlOiBJbmZsYXRpb24gRGF0YSkNCg0KDQoqKkZhbHRhIGNvbnN0cnVpciB1bmEgcGFyaWRhZCBkZSBleHBvL2ltcG8gY29uIGVsIGZsZXRlKioNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNCYXNlIHJlZ2FsaWFzDQpwcmVjaW9fbWVfcmVnYWxpYXNfY3J1ZG8gPC0gcmVhZF9kZWxpbSgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZWdhbGlhcy9wcmVjaW9fbWVyY2Fkb19leHRlcm5vX2NydWRvX3JlZ2FsaWFzLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lDQogIHJlbmFtZShhbmlvID0gIkHDkU8iLA0KICAgICAgICAgbWVzID0gIk1FUyIsDQogICAgICAgICB0b3RhbF90aXBvX2NydWRvID0gIlRPVEFMIFRJUE8gREUgQ1JVRE8iKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiVVNEL20zIiwNCiAgICAgICAgIGFuaW8gPSBuYS5sb2NmKGFuaW8pKSAlPiUNCiAgc2VsZWN0KGFuaW8sIG1lcywgdW5pZGFkLCB0b3RhbF90aXBvX2NydWRvLCBldmVyeXRoaW5nKC4pLCAtYyhCUkVOVCwgV1RJKSkgJT4lIA0KICBnYXRoZXIoLiwNCiAgICAgICAgIGtleSA9ICJ0aXBvX2NydWRvIiwNCiAgICAgICAgIHZhbHVlID0gInZhbG9yIiwNCiAgICAgICAgIDU6bmNvbCguKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQpICU+JQ0KICBzdW1tYXJpc2UocHJlY2lvX3RvdGFsX3RpcG9fY3J1ZG8gPSBtZWFuKHRvdGFsX3RpcG9fY3J1ZG8pKSAlPiUgDQogICAgICAgICAgICAjIHByZWNpb19wcm9tZWRpb190aXBvX2NydWRvID0gbWVhbih2YWxvcikpJT4lIA0KICBtdXRhdGUodGlwb19wcmVjaW8gPSAibWVyY2FkbyBleHRlcm5vIiwNCiAgICAgICAgIHByZWNpb190b3RhbF90aXBvX2NydWRvID0gY29udmVyc29yX20zYmJsX3AocHJlY2lvX3RvdGFsX3RpcG9fY3J1ZG8pLA0KICAgICAgICAgdW5pZGFkID0gIlVTRC9iYXJyaWxlcyIpDQoNCiMgTWVjb24gTU9ESUZJQ0FSIA0KcHJlY2lvX2V4cG9ydGFjaW9uX2NydWRvIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvcHJlY2lvLWV4cG9ydGFjaW9uLWNydWRvLnhsc3giLCANCiAgICBza2lwID0gMikNCg0KI0lOREVDIENvbUV4DQpwcmVjaW9fZXhwb19pbmRlYyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSU5ERUMvQ29tRXgvcHJlY2lvX2FudWFsX3Byb21lZGlvX2V4cG9faGlkcm9faW5kZWMuY3N2IiwgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsICU+JSBzZWxlY3QoLVRDUCkpICAlPiUgDQogIG11dGF0ZSggcHJlY2lvX2V4cG9fZ2FzX2luZGVjID0gKHByZWNpb19leHBvX2dhc19pbmRlYykgKiBUQ0MsDQogICAgICAgICAgICAgICAgICAgICAgdW5pZGFkX2dhcyA9ICJhcnMvTWlsZXMgZGUgbTMiCSkNCiAgIyBtdXRhdGUocHJlY2lvX2V4cG9fZ2FzX2luZGVjID0gcHJlY2lvX2V4cG9fZ2FzX2luZGVjICogVENDLCANCiAgIyAgICAgICAgdW5pZGFkID0gY2FzZV93aGVuKHVuaWRhZCA9PSAiVVNEL01pbGVzIGRlIG0zIiB+ICJhcnMvTWlsZXMgZGUgbTMiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHVuaWRhZCkpDQoNCiNVTiBDT01UUkFERQ0KZXhwb19jcnVkb191bmNvbXRyYWRlX2hzIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9VTiBDb210cmFkZS9leHBvX2NydWRvX3VuY29tdHJhZGVfaHMuY3N2IikgJT4lIA0KICBtdXRhdGUodW5pZGFkX3ByZWNpbyA9ICJVU0QvYmFycmlsZXMiLA0KICAgICAgICAgdW5pZGFkX3ZhbG9yID0gIlVTRCIsDQogICAgICAgICB1bmlkYWRfY2FudGlkYWQgPSAiYmFycmlsZXMiKSAlPiUgDQogIHJlbmFtZShhbmlvID0gUGVyaW9kLA0KICAgICAgICAgcHJlY2lvX2V4cG9fY29tdHJhZGVfaHNfY3J1ZG8gPSBleHBvX3ByZWNpb19iYmwsIA0KICAgICAgICAgZXhwb191c2RfY29tdHJhZGVfY3J1ZG8gPSAiVHJhZGUgVmFsdWUgKFVTJCkiKQ0KDQpleHBvX2NydWRvX3NpdGMgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL1VOIENvbXRyYWRlL2V4cG9fY3J1ZG9fc2l0Yy5jc3YiKSAlPiUgDQogIG11dGF0ZSh1bmlkYWRfcHJlY2lvID0gIlVTRC9iYXJyaWxlcyIsDQogICAgICAgICB1bmlkYWRfdmFsb3IgPSAiVVNEIiwNCiAgICAgICAgIHVuaWRhZF9jYW50aWRhZCA9ICJiYXJyaWxlcyIpICU+JSANCiAgcmVuYW1lKGFuaW8gPSBQZXJpb2QsDQogICAgICAgICBwcmVjaW9fZXhwb19jb210cmFkZV9zaXRjX2NydWRvID0gZXhwb19wcmVjaW9fYmJsLCANCiAgICAgICAgIGV4cG9fdXNkX2NvbXRyYWRlX2NydWRvID0gIlRyYWRlIFZhbHVlIChVUyQpIikNCg0KI01lcmdlIGJhc2VzDQpwcmVjaW9fZXhwb19jcnVkbyA8LSBwcmVjaW9fbWVfcmVnYWxpYXNfY3J1ZG8gJT4lIA0KICByZW5hbWUocHJlY2lvX2V4cG9fcmVnYWxpYXNfY3J1ZG8gPSBwcmVjaW9fdG90YWxfdGlwb19jcnVkbykgJT4lIA0KICBzZWxlY3QoLXRpcG9fcHJlY2lvKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9zX21lY29uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHByZWNpb19leHBvX21lY29uX2NydWRvID0gcHJlY2lvX2NydWRvX21lX3VzZF9iYmwgKSkgJT4lDQogIGxlZnRfam9pbihwcmVjaW9fZXhwb19pbmRlYyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCgtYyhwcmVjaW9fZXhwb19nYXNfaW5kZWMsIHVuaWRhZF9nYXMpKSkgJT4lDQogIGxlZnRfam9pbihleHBvX2NydWRvX3VuY29tdHJhZGVfaHMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX3ByZWNpbywgcHJlY2lvX2V4cG9fY29tdHJhZGVfaHNfY3J1ZG8pKSAlPiUgDQogIGZ1bGxfam9pbihleHBvX2NydWRvX3NpdGMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX3ByZWNpbywgcHJlY2lvX2V4cG9fY29tdHJhZGVfc2l0Y19jcnVkbykpICU+JQ0KICBhcnJhbmdlKGFuaW8pICU+JSANCiAgIyBtdXRhdGUocHJlY2lvX2V4cG9fY3J1ZG8gPSBjYXNlX3doZW4oYW5pbyA8IDE5OTMgfiBwcmVjaW9fZXhwb19jb210cmFkZV9zaXRjX2NydWRvLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyAlaW4lIDE5OTM6MjAxNCB+IHByZWNpb19leHBvX21lY29uX2NydWRvLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+IDIwMTQgfiBwcmVjaW9fZXhwb19yZWdhbGlhc19jcnVkbykpICU+JSANCiAgIyBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fZXhwb19jcnVkbywgZXZlcnl0aGluZyguKSwgLVRDQykNCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSwgLVRDQykNCiMgcHJlY2lvX2V4cG9fY3J1ZG8NCg0KYGBgDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyMjIFByZWNpbyBSZWZlcmVuY2lhIE1lcmNhZG8gRXh0ZXJubyBDcnVkbw0KI0JyZW50DQpicmVudF9hIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUHJlY2lvcy9icmVudC54bHN4IiwgDQogICAgc2tpcCA9IDQpJT4lICANCiAgcmVuYW1lKGFuaW8gPSBZZWFyLCBicmVudF9ub21pbmFsID0gYE5vbWluYWwgUHJpY2VgLCBicmVudF9hZGp1c3RlZCA9IGBJbmZsYXRpb24gQWRqdXN0ZWQgUHJpY2VgKSAgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIlVTRC9iYXJyaWxlcyIsDQogICAgICAgICBhbmlvID0gYXMuZG91YmxlKGFuaW8pKSANCg0KDQpicmVudF9kYWlseSAgPC0gIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUHJlY2lvcy9SQlJURWQueGxzIiwgDQogICAgc2hlZXQgPSAiRGF0YSAxIiwgc2tpcCA9IDIpICU+JQ0KICByZW5hbWUoZmVjaGEgPSBEYXRlLCBicmVudF9zcG90ID0gYEV1cm9wZSBCcmVudCBTcG90IFByaWNlIEZPQiAoRG9sbGFycyBwZXIgQmFycmVsKWApICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJVU0QvYmFycmlsZXMiLA0KICAgICAgICAgZmVjaGEgPSBhcy5EYXRlKGZlY2hhKSwgDQogICAgICAgICBhbmlvID0geWVhcihmZWNoYSkpIA0KDQpicmVudF9JRUEgIDwtICBicmVudF9kYWlseSAlPiUgDQogIGdyb3VwX2J5KHVuaWRhZCwgYW5pbykgJT4lIA0KICBzdW1tYXJpc2UoYnJlbnRfc3BvdCA9IG1lYW4oYnJlbnRfc3BvdCkpDQoNCmJyZW50IDwtIGJyZW50X2EgJT4lDQogIHNlbGVjdCgtYnJlbnRfYWRqdXN0ZWQpICU+JSANCiAgbGVmdF9qb2luKGJyZW50X0lFQSkgJT4lIA0KICBtdXRhdGUoZGlmID0gYnJlbnRfc3BvdC9icmVudF9ub21pbmFsIC0gMSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBldmVyeXRoaW5nKC4pKSAlPiUgDQogIHJlbmFtZShicmVudF9pZWEgPSBicmVudF9zcG90LA0KICAgICAgICAgYnJlbnRfaGlzdG9yaWMgPSBicmVudF9ub21pbmFsKQ0KDQojV1RJIA0Kd3RpX0VJQV9kYWlseSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9FSUEvZGF0YS9SV1RDZC54bHMiLCANCiAgICBzaGVldCA9ICJEYXRhIDEiLCBza2lwID0gMikgJT4lIA0KICByZW5hbWUod3RpX2VpYSA9IGBDdXNoaW5nLCBPSyBXVEkgU3BvdCBQcmljZSBGT0IgKERvbGxhcnMgcGVyIEJhcnJlbClgICkgJT4lIA0KICBtdXRhdGUobWVzID0gbW9udGgoRGF0ZSksDQogICAgICAgICBhbmlvID0geWVhcihEYXRlKSwNCiAgICAgICAgIHVuaWRhZCA9ICJVU0QvYmFycmlsZXMiKQ0KDQp3dGlfRUlBIDwtIHd0aV9FSUFfZGFpbHkgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQpICU+JSANCiAgc3VtbWFyaXNlKHd0aV9laWEgPSBtZWFuKHd0aV9laWEsIG5hLnJtID0gVCkpDQoNCnd0aV9mcmVkIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9GUkVEL1dUSVNQTEMuY3N2IikgICU+JQ0KICByZW5hbWUod3RpX3Nwb3RfcHJpY2UgPSBXVElTUExDKSAlPiUgDQogIG11dGF0ZShhbmlvID0geWVhcihEQVRFKSwNCiAgICAgICAgIHVuaWRhZCA9ICJVU0QvYmFycmlsZXMiKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lIA0KICBzdW1tYXJpc2Uod3RpX3Nwb3RfcHJpY2VfZnJlZCA9IG1lYW4od3RpX3Nwb3RfcHJpY2UpKQ0KICANCnd0aV9yZXRlbmNpb25fMDQgPC0gd3RpX0VJQV9kYWlseSAgJT4lIA0KICBmaWx0ZXIoYW5pbyA+IDIwMDMgKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIG1lcykgJT4lIA0KICBzdW1tYXJpc2Uod3RpID0gbWVhbih3dGlfZWlhKSkgJT4lIA0KICBtdXRhdGUocmV0ZW5jaW9uID0gY2FzZV93aGVuKHd0aSA8IDMyIH4gMC4yNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3dGkgPj0gMzIgJiB3dGkgPCAzNC45OSB+IDAuMjgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3RpID49IDM1ICYgd3RpIDwgMzYuOTkgfiAwLjMxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd0aSA+PSAzNyAmIHd0aSA8IDM4Ljk5IH4gMC4zNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3dGkgPj0gMzkgJiB3dGkgPCA0MC45OSB+IDAuMzcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3RpID49IDQxICYgd3RpIDwgNDIuOTkgfiAwLjQwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd0aSA+PSA0MyAmIHd0aSA8IDQ0Ljk5IH4gMC40MywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3dGkgPj0gNDUgfiAwLjQ1KSkgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShyZXRlbmNpb24gPSBtZWFuKHJldGVuY2lvbikpDQoNCg0Kd3RpX3JldGVuY2lvbl8wNyA8LSB3dGlfRUlBX2RhaWx5ICU+JSANCiAgZmlsdGVyKGFuaW8gJWluJSBjKCAyMDA3OjIwMTQpLCBEYXRlID4gIjIwMDctMTEtMDIiICkgJT4lIA0KICBtdXRhdGUocmV0ZW5jaW9uID0gY2FzZV93aGVuKHd0aV9laWEgPj0gNjAuOSB+ICh3dGlfZWlhIC0gNDIpLzQyICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3dGlfZWlhIDwgNjAuOSB+IDAuNDUpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKHd0aV9laWEgPSBtZWFuKHd0aV9laWEpLA0KICAgICAgICAgICAgcmV0ZW5jaW9uID0gIG1lYW4ocmV0ZW5jaW9uKSkNCg0KYnJlbnRfcmVudGVuY2lvbl8xNCA8LSAgYnJlbnRfZGFpbHkgJT4lDQogICBmaWx0ZXIoYW5pbyAlaW4lIGMoIDIwMTQ6MjAxNSksIGZlY2hhID4gIjIwMDctMTEtMDIiICkgJT4lDQogIG11dGF0ZShyZXRlbmNpb24gPSBjYXNlX3doZW4oYnJlbnRfc3BvdCA+PSA3MSB+IChicmVudF9zcG90IC0gNzApLzcwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZW50X3Nwb3QgPCA3MSB+IDAuMDEpKSAlPiUgDQogICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShicmVudF9zcG90ID0gbWVhbihicmVudF9zcG90KSwNCiAgICAgICAgICAgIHJldGVuY2lvbiA9ICBtZWFuKHJldGVuY2lvbikpDQogIA0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNQcmVjaW8gZGUgZXhwb3J0YWNpb24geSByZWZlcmVuY2lhLiBNZXJnZSBkZSBiYXNlcw0KcHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbyA8LSAgcHJlY2lvX2V4cG9fY3J1ZG8gICU+JSAgIA0KICBmdWxsX2pvaW4oYnJlbnQgJT4lIHNlbGVjdCgtZGlmKSkgJT4lIA0KICBsZWZ0X2pvaW4od3RpX0VJQSApICU+JSANCiAgZnVsbF9qb2luKHd0aV9mcmVkKSAlPiUgDQogIG11dGF0ZShwcmVjaW9fZXhwb19jcnVkb19pbmRlYyA9IGNhc2Vfd2hlbihwcmVjaW9fZXhwb19jcnVkb19pbmRlYyA+IDMwMCB+IE5BX3JlYWxfLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHByZWNpb19leHBvX2NydWRvX2luZGVjKSwNCiAgICAgICAgIHByZWNpb19tZV9jcnVkbyA9IGNhc2Vfd2hlbihhbmlvICVpbiUgMTk5MzoyMDAxIHwgYW5pbyAlaW4lIDIwMDQ6MjAxNCB+IHByZWNpb19leHBvX21lY29uX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gJWluJSAyMDAyOjIwMDMgfiBwcmVjaW9fZXhwb19jb210cmFkZV9oc19jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID4gMjAxNCB+IHByZWNpb19leHBvX3JlZ2FsaWFzX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKHByZWNpb19leHBvX2NvbXRyYWRlX3NpdGNfY3J1ZG8pIH4gYnJlbnRfaGlzdG9yaWMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA8IDE5OTMgfiBwcmVjaW9fZXhwb19jb210cmFkZV9zaXRjX2NydWRvKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fbWVfY3J1ZG8sIGV2ZXJ5dGhpbmcoLikpICU+JSANCiAgYXJyYW5nZShhbmlvKSAlPiUgDQogIGZpbHRlcihhbmlvIDwgMjAyMSkNCg0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gocHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbywgDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL3ByZWNpb19leHBvX3lfbWRvX211bmRpYWxfY3J1ZG8ueGxzeCIpDQpwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvICU+JSANCiAgc2VsZWN0KC1wcmVjaW9fbWVfY3J1ZG8pDQoNCg0KZ3JhZl9wcmVjaW9fbWRvX211bmRpYWxfY3J1ZG8gPC0gcHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbyAlPiUgDQogIHNlbGVjdCgtcHJlY2lvX21lX2NydWRvKSAlPiUgDQogIGdhdGhlcihrZXkgPSB0aXBvX3ByZWNpbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAzOm5jb2woLikpICU+JQ0KICAjIGZpbHRlcighKHRpcG9fcHJlY2lvICVpbiUgYygicHJlY2lvX2dhc19ib2xpdmlhX3VzZF9pZGVlIiwgInByZWNpb19pbXBvX2dhc19ib2xpdmlhX01NQlRVX2NvbXRyYWRlIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZWNpb19leHBvX2dhc19jb210cmFkZSIsICJwcmVjaW9fZXhwb19nYXNfaW5kZWMiKSkpICU+JQ0KICAjIGZpbHRlcihhbmlvICE9IDIwMDIgJiB0aXBvX3ByZWNpbyAhPSAicHJlY2lvX2V4cG9fY3J1ZG9faW5kZWMiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gYW5pbywgeSA9IHZhbG9yLCBjb2xvciA9IHRpcG9fcHJlY2lvKSkrDQogIGdlb21fbGluZShhbHBoYSA9IDAuOSkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiUHJlY2lvcyBkZSBleHBvcnRhY2nDs24geSByZWZlcmVuY2lhIGRlbCBtZXJjYWRvIG11bmRpYWwgZGVsIGNydWRvIiwgDQogICAgICAgeSA9ICJVU0QvYmFycmlsZXMiKQ0KDQpnZ3Bsb3RseShncmFmX3ByZWNpb19tZG9fbXVuZGlhbF9jcnVkbywgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCg0KYGBgDQoNCiMjIyMgUHJlY2lvcyBkZSBSZWZlcmVuY2lhIGRlbCBHYXMNCg0KKiBDcml0ZXJpbyBkZSBwcmVjaW9fZXh0ZXJub19nYXM6DQogICsgQcOxb3MgMTk2NCB5IDE5NjU6IFByZWNpbyBkZSBpbXBvcnRhY2nDs24gZGUgZ2FzIHByb3ZlbmllbnRlIGRlIEJvbGl2aWEgaGFjaWEgQXJnZW50aW5hIGRlIFVOIENvbXRyYWRlDQogICsgMTk2NiBlbiBhZGVsYW50ZTogUHJlY2lvIGRlIGV4cG9ydGFjaW9uIGRlIGdhcyBkZXNkZSBCb2xpdmlhIGEgQXJnZW50aW5hIGRlIFVOIENvbXRyYWRlDQogICsgRGF0b3MgZmFsdGFudGVzIHBhcmEgbG9zIGHDsW9zIHByZXZpb3MgYSAxOTYzIHkgcGVyw61vZG8gMTk2OC0xOTcxDQoNCiMjIyMjIEV4cG9ydGFjacOzbiBBcmdlbnRpbmENCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMjIyBQcmVjaW8gZGUgRXhwb3J0YWNpw7NuIGRlbCBHYXMgDQojcmVnYWxpYXMNCnByZWNpb19leHBvX3JlZ2FsaWFzX2dhcyA8LSByZWFkX2RlbGltKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JlZ2FsaWFzL3ByZWNpb19tZXJjYWRvX2V4dGVybm9fZ2FzX3JlZ2FsaWFzLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lDQogICByZW5hbWUoYW5pbyA9ICJBw5FPIiwNCiAgICAgICAgIG1lcyA9ICJNRVMiLA0KICAgICAgICAgdG90YWxfY3VlbmNhID0gIlRPVEFMIENVRU5DQSIpICU+JSANCiAgIG11dGF0ZSh1bmlkYWQgPSAiYXJzL01pbGVzIGRlIG0zIiwNCiAgICAgICAgICBhbmlvID0gbmEubG9jZihhbmlvKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgbWVzLCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLikpICU+JSANCiAgZ2F0aGVyKC4sDQogICAgICAgICBrZXkgPSAiY3VlbmNhIiwNCiAgICAgICAgIHZhbHVlID0gInZhbG9yIiwNCiAgICAgICAgIDQ6bmNvbCguKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQsIGN1ZW5jYSkgJT4lDQogIG11dGF0ZSh2YWxvciA9IGdzdWIoIiwiLCAiIiwgdmFsb3IpLA0KICAgICAgICAgdmFsb3IgPSBhcy5kb3VibGUodmFsb3IpKSAlPiUgIA0KICBzdW1tYXJpc2UocHJlY2lvX2V4cG9fZ2FzX3JlZ2FsaWFzID0gbWVhbih2YWxvciwgbmEucm0gPSBUKSkgJT4lIA0KICBtdXRhdGUodGlwb19wcmVjaW8gPSAibWVyY2FkbyBleHRlcm5vIikgJT4lDQogIGZpbHRlcihjdWVuY2EgPT0gInRvdGFsX2N1ZW5jYSIpJT4lDQogIGFycmFuZ2UoYW5pbykNCg0KI2NvbXRyYWRlDQpleHBvX2dhc19jb210cmFkZSA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvVU4gQ29tdHJhZGUvcmVzdWx0YWRvcy9leHBvX2dhc19zaXRjLmNzdiIpICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iICU+JSBzZWxlY3QoYW5pbywgdGNjKSkgJT4lIA0KICBtdXRhdGUoZXhwb19wcmVjaW9fTU1CVFUgPSBjb252ZXJzb3JfbTNNTUJUVV9wKGV4cG9fcHJlY2lvX01tMyApLA0KICAgICAgICAgZXhwb19wcmVjaW9fTW0zX2FycyA9IGV4cG9fcHJlY2lvX01tMyAqIHRjYykgDQoNCiNtZXJnZSBkZSBiYXNlcw0KI3ByZWNpbyBlbiBwZXNvcw0KcHJlY2lvX2V4cG9fZ2FzIDwtIGV4cG9fZ2FzX2NvbXRyYWRlICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJhcnMvTWlsZXMgZGUgbTMiKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19leHBvX2dhc19jb210cmFkZSA9IGV4cG9fcHJlY2lvX01tM19hcnMpICU+JSANCiAgZnVsbF9qb2luKHByZWNpb19leHBvX3JlZ2FsaWFzX2dhcyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCgtYyhjdWVuY2EsIHRpcG9fcHJlY2lvKSkpICU+JQ0KICBsZWZ0X2pvaW4ocHJlY2lvX2V4cG9faW5kZWMgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQgPSB1bmlkYWRfZ2FzLCBwcmVjaW9fZXhwb19nYXNfaW5kZWMpICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKCEoaXMubmEocHJlY2lvX2V4cG9fZ2FzX2luZGVjKSkpKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9zX21lY29uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHByZWNpb19leHBvX2dhc19tZWNvbiA9IHByZWNpb19nYXNfbWVfcGVzb3NfTW0zKSkNCg0KDQojcHJlY2lvcyBlbiBkb2xhcmVzDQpwcmVjaW9fZXhwb19nYXNfdXNkIDwtIGV4cG9fZ2FzX2NvbXRyYWRlICAlPiUgIA0KICBzZWxlY3QoYW5pbywgIHByZWNpb19leHBvX2dhc19jb210cmFkZSA9IGV4cG9fcHJlY2lvX01NQlRVKSAlPiUNCiAgbGVmdF9qb2luKCBwcmVjaW9fZXhwb19nYXMgJT4lIHNlbGVjdCgtYyhwcmVjaW9fZXhwb19nYXNfY29tdHJhZGUsIHVuaWRhZCkpLCBieSA9ICJhbmlvIikgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsICU+JSBzZWxlY3QoLVRDUCkpICU+JQ0KICBtdXRhdGUocHJlY2lvX2V4cG9fZ2FzX3JlZ2FsaWFzID0gKHByZWNpb19leHBvX2dhc19yZWdhbGlhcy8xMDAwKSAvIFRDQywgDQogICAgICAgICBwcmVjaW9fZXhwb19nYXNfaW5kZWMgPSAocHJlY2lvX2V4cG9fZ2FzX2luZGVjICkvIFRDQywgDQogICAgICAgICBwcmVjaW9fZXhwb19nYXNfbWVjb24gPSAocHJlY2lvX2V4cG9fZ2FzX21lY29uLzEwMDApLyBUQ0MsDQogICAgICAgICB1bmlkYWQgPSAiVVNEL01NQlRVIikgJT4lIA0KICBtdXRhdGVfYXQoLnZhcnMgPSBjKCJwcmVjaW9fZXhwb19nYXNfcmVnYWxpYXMiLCAicHJlY2lvX2V4cG9fZ2FzX2luZGVjIiwgInByZWNpb19leHBvX2dhc19tZWNvbiIpLA0KICAgICAgICAgICAgLmZ1bnMgPSBjb252ZXJzb3JfbTNNTUJUVV9wKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLiksLVRDQykNCg0KDQpgYGANCg0KIyMjIyMgUmVmZXJlbmNpYXMgbXVuZGlhbGVzDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMgUHJlY2lvIFJlZmVyZW5jaWEgTWVyY2FkbyBFeHRlcm5vIEdhcyANCiMjIyMgUHJlY2lvcyBNdW5kaWFsZXMNCiNoZW5yeV9odWIgRUlBDQpoZW5yeV9odWIgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9QcmVjaW9zL1JOR1dISERkLnhscyIsIA0KICAgIHNoZWV0ID0gIkRhdGEgMSIsIHNraXAgPSAyKSAlPiUgDQogIHJlbmFtZSggZGF0ZSA9IERhdGUsDQogICAgaGVucnlfaHViX3Nwb3QgPSBgSGVucnkgSHViIE5hdHVyYWwgR2FzIFNwb3QgUHJpY2UgKERvbGxhcnMgcGVyIE1pbGxpb24gQnR1KWApICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJVU0QvTU1CVFUiLA0KICAgICAgICAgYW5pbyA9IHllYXIoZGF0ZSkpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkKSAlPiUgDQogIHN1bW1hcmlzZShlaWFfaGVucnlfaHViX3Nwb3QgPSBtZWFuKGhlbnJ5X2h1Yl9zcG90LCBuYS5ybSA9IFQpKSANCg0KaGVucnlfaHViX2FycyA8LSAgaGVucnlfaHViICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbCAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBUQ0MpKSAlPiUgDQogIG11dGF0ZShoZW5yeV9odWJfc3BvdCA9IGNvbnZlcnNvcl9NTUJUVW0zZ2FzX3AoZWlhX2hlbnJ5X2h1Yl9zcG90ICoxMDAwKlRDQyksDQogICAgICAgICB1bmlkYWQ9ICJhcnMvTWlsZXMgZGUgbTMiKQ0KDQojIFByZWNpbyBVU0EgYm9jYSBkZSBwb3pvIEVJQSAgICAgICAgICB1bmlkYWQgPSAiVVNEL2Z0MyINCndlbGxoZWFkX3ByaWNlX2VldXUgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvRUlBL2RhdGEvbmF0dXJhbF9nYXNfd2VsbGhlYWRfcHJpY2VfZWV1dS54bHMiLCANCiAgICBzaGVldCA9ICJEYXRhIDEiLCBza2lwID0gMikgJT4lIA0KICByZW5hbWUodXNfd2VsbGhlYWRfcHJpY2VfZnQzID0gIlUuUy4gTmF0dXJhbCBHYXMgV2VsbGhlYWQgUHJpY2UgKERvbGxhcnMgcGVyIFRob3VzYW5kIEN1YmljIEZlZXQpIikgJT4lICANCiAgbXV0YXRlKCB1c193ZWxsaGVhZF9wcmljZV9NbTMgPSBjb252ZXJzb3JfZnQzbTNfcCh1c193ZWxsaGVhZF9wcmljZV9mdDMqMTAwMCksDQogICAgICAgICAgdXNfd2VsbGhlYWRfcHJpY2VfTU1CVFUgPSBjb252ZXJzb3JfZnQzTU1CVFVfcCh1c193ZWxsaGVhZF9wcmljZV9mdDMvMTAwMCksDQogICAgICAgICAgYW5pbyA9IHllYXIoRGF0ZSksDQogICAgICAgICB1bmlkYWQgID0gIlVTRCIpIA0KDQojb3Ryb3MgcHJlY2lvcyBkZSBVU0EgRUlBDQpwcmljZV9lZXV1IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0VJQS9kYXRhL25hdHVyYWxfZ2FzX3ByaWNlc191c2EueGxzIiwgDQogICAgc2hlZXQgPSAiRGF0YSAxIiwgc2tpcCA9IDIpICU+JSANCiAgcmVuYW1lKHVzX3dlbGxoZWFkX2dhc19wcmljZSA9IGBVLlMuIE5hdHVyYWwgR2FzIFdlbGxoZWFkIFByaWNlIChEb2xsYXJzIHBlciBUaG91c2FuZCBDdWJpYyBGZWV0KWAsDQogICAgICAgICB1c19pbXBvcnRfZ2FzX3ByaWNlID0gYFByaWNlIG9mIFUuUy4gTmF0dXJhbCBHYXMgSW1wb3J0cyAoRG9sbGFycyBwZXIgVGhvdXNhbmQgQ3ViaWMgRmVldClgLA0KICAgICAgICAgdXNfcGlwZWxpbmVfaW1wb3J0X3ByaWNlID0gYFUuUy4gTmF0dXJhbCBHYXMgUGlwZWxpbmUgSW1wb3J0cyBQcmljZSAoRG9sbGFycyBwZXIgVGhvdXNhbmQgQ3ViaWMgRmVldClgLA0KICAgICAgICAgdXNfbG5nX2ltcG9ydF9wcmljZSA9IGBQcmljZSBvZiBVLlMuIE5hdHVyYWwgR2FzIExORyBJbXBvcnRzIChEb2xsYXJzIHBlciBUaG91c2FuZCBDdWJpYyBGZWV0KWAsDQogICAgICAgICB1c19leHBvcnRfZ2FzX3ByaWNlID0gYFByaWNlIG9mIFUuUy4gTmF0dXJhbCBHYXMgRXhwb3J0cyAoRG9sbGFycyBwZXIgVGhvdXNhbmQgQ3ViaWMgRmVldClgLA0KICAgICAgICAgdXNfZXhwb3J0X2dhc19waXBlbGluZV9wcmljZSA9IGBQcmljZSBvZiBVLlMuIE5hdHVyYWwgR2FzIFBpcGVsaW5lIEV4cG9ydHMgKERvbGxhcnMgcGVyIFRob3VzYW5kIEN1YmljIEZlZXQpYCwNCiAgICAgICAgIHVzX2V4cG9ydF9sbmdfcHJpY2UgPSBgUHJpY2Ugb2YgTGlxdWVmaWVkIFUuUy4gTmF0dXJhbCBHYXMgRXhwb3J0cyAoRG9sbGFycyBwZXIgVGhvdXNhbmQgQ3ViaWMgRmVldClgKSAlPiUgDQogIHNlbGVjdCh1c193ZWxsaGVhZF9nYXNfcHJpY2UsIHVzX2ltcG9ydF9nYXNfcHJpY2UsIHVzX3BpcGVsaW5lX2ltcG9ydF9wcmljZSwNCiAgICAgICAgdXNfbG5nX2ltcG9ydF9wcmljZSwgdXNfZXhwb3J0X2dhc19wcmljZSwNCiAgICAgICAgdXNfZXhwb3J0X2dhc19waXBlbGluZV9wcmljZSwgdXNfZXhwb3J0X2xuZ19wcmljZSApICU+JSANCiAgbXV0YXRlKGFuaW8gPSAxOTIyOjIwMTkpDQogIA0KDQpwcmljZV9lZXV1X01tMyA8LSAgcHJpY2VfZWV1dSAlPiUgDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCl7Y29udmVyc29yX2Z0M20zX3AoIDEwMDApfSkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDE5MjI6MjAxOSwNCiAgICAgICAgIHVuaWRhZCA9ICJVU0QvTWlsZXMgZGUgbTMiKSANCg0KcHJpY2VfZWV1dV9NTUJUVSA8LSAgcHJpY2VfZWV1dSAlPiUgDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCl7Y29udmVyc29yX2Z0M01NQlRVX3AoeCAvMTAwMCl9KSAlPiUgDQogIG11dGF0ZShhbmlvID0gMTkyMjoyMDE5LA0KICAgICAgICAgdW5pZGFkID0gIlVTRC9NTUJUVSIpICAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLikpDQogIA0KDQojZXVyb3N0YXQNCg0KDQojQlANCmJwX2dhc19wcmljZXMgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvQlAvYnAtc3RhdHMtcmV2aWV3LTIwMjAtYWxsLWRhdGEueGxzeCIsIA0KICAgIHNoZWV0ID0gIkdhcyAtIFByaWNlcyAiLCBza2lwID0gMykgJT4lIA0KICByZW5hbWUoYW5pbyA9IC4uLjEsIA0KICAgICAgICAgYnBfbG5nX2phcGFuX2NpZiA9IEphcGFuLA0KICAgICAgICAgYnBfbG5nX2prbSA9ICJKYXBhbiBLb3JlYSBNYXJrZXIiLA0KICAgICAgICAgYnBfZ2FzX2dlcm1hbl9pbXBvcnRfcHJpY2UgPSAiQXZlcmFnZSBHZXJtYW4iLA0KICAgICAgICAgYnBfZ2FzX25icCA9IFVLLA0KICAgICAgICAgYnBfZ2FzX25ldGhlcmxhbmRzX3R0ZiA9ICJOZXRoZXJsYW5kcyBUVEYiLA0KICAgICAgICAgYnBfZ2FzX2hlbnJ5X2h1YiA9IFVTLA0KICAgICAgICAgYnBfZ2FzX2NhbmFkYSA9IENhbmFkYSwgDQogICAgICAgICBicF9vaWxfbWl4X21lYW5fb2VjZCA9IE9FQ0QpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpICU+JSANCiAgZmlsdGVyKCFpcy5uYShhbmlvKSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIlVTRC9NTUJUVSIpDQoNCmJwX2dhc18yMDE2IDwtIGJwX2dhc19wcmljZXMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgYnBfbG5nX2prbSwgYnBfZ2FzX2hlbnJ5X2h1YiwgYnBfZ2FzX25ldGhlcmxhbmRzX3R0ZiApICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKGFuaW8gPT0gMjAxNikNCg0KDQojRk1JDQpmbWlfcHJpY2VzIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9GTUkvUENQU18wOS0xNi0yMDIwIDE1LTA3LTEwLTY2X3RpbWVTZXJpZXMuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhYMzggPSBjb2xfc2tpcCgpKSkNCg0KZm1pX2dhc19wcmljZSA8LSBmbWlfcHJpY2VzICU+JSANCiAgZmlsdGVyKGBDb21tb2RpdHkgTmFtZWAgJWluJSBjKCJOYXR1cmFsIGdhcywgRVUiLCJOYXR1cmFsIEdhcywgVVMgSGVucnkgSHViIEdhcyIsIkxORywgQXNpYSIgICksDQogICAgICAgICBgVW5pdCBOYW1lYCA9PSAiSW5kZXgiKSAlPiUgDQogIHJlbmFtZShjb21tb2RpdHkgPSAiQ29tbW9kaXR5IE5hbWUiLA0KICAgICAgICAgdW5pZGFkID0gIlVuaXQgTmFtZSIpICU+JSANCiAgZ2F0aGVyKC4sDQogICAgICAgICBrZXkgPSBhbmlvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwgDQogICAgICAgICAgIDg6bmNvbCguKSkgJT4lIA0KICBzZWxlY3QoY29tbW9kaXR5LCBhbmlvLCB2YWxvciwgdW5pZGFkICkgJT4lIA0KICBtdXRhdGUodmFsb3IgPSB2YWxvciAvIDEwMCwNCiAgICAgICAgIGFuaW8gPSBhcy5kb3VibGUoYW5pbykpICU+JSANCiAgc3ByZWFkKC4sDQogICAgICAgICBrZXkgPSBjb21tb2RpdHksIA0KICAgICAgICAgdmFsdWUgPSB2YWxvcikgJT4lIA0KICByZW5hbWUoZm1pX2xuZ19hc2lhID0gIkxORywgQXNpYSIsDQogICAgICAgICBmbWlfbmF0dXJhbF9nYXNfZXUgPSJOYXR1cmFsIGdhcywgRVUiLA0KICAgICAgICAgZm1pX2hlbnJ5X2h1YiA9ICJOYXR1cmFsIEdhcywgVVMgSGVucnkgSHViIEdhcyIpICU+JSANCiAgbXV0YXRlKGZtaV9sbmdfYXNpYSA9IGZtaV9sbmdfYXNpYSAqIGJwX2dhc18yMDE2JGJwX2xuZ19qa20sDQogICAgICAgICBmbWlfaGVucnlfaHViID0gIGZtaV9oZW5yeV9odWIgKiBicF9nYXNfMjAxNiRicF9nYXNfaGVucnlfaHViLA0KICAgICAgICAgZm1pX25hdHVyYWxfZ2FzX2V1ID0gZm1pX25hdHVyYWxfZ2FzX2V1ICogYnBfZ2FzXzIwMTYkYnBfZ2FzX25ldGhlcmxhbmRzX3R0ZiwNCiAgICAgICAgIHVuaWRhZCA9ICJVU0QvTU1CVFUiKQ0KDQoNCiMgdW5pcXVlKGZtaV9wcmljZXMkYENvbW1vZGl0eSBOYW1lYCkNCiMgdW5pcXVlKGZtaV9wcmljZXMkYFVuaXQgTmFtZWApDQojIHVuaXF1ZShmbWlfcHJpY2VzJGBDb3VudHJ5IE5hbWVgKQ0KYGBgDQoNCg0KIyMjIyMgQm9saXZpYQ0KIA0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KIyMjIyBQcmVjaW8gZGUgaW1wb3J0YWNpw7NuIGRlIEJvbGl2aWENCiNQcmVjaW8gaW1wbyBib2xpdmlhIHJldmlzdGEgSURFRQ0KcHJlY2lvX2lkZWVfaW1wb19nYXMgPC0gY3VhZHJvXzQuMyAgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkX2dhcywgcHJlY2lvX2dhc19ib2xpdmlhKSAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfNzApKSAlPiUNCiAgbXV0YXRlKHByZWNpb19nYXNfYm9saXZpYV9pZGVlID0gcHJlY2lvX2dhc19ib2xpdmlhICogaXBjXzcwIC8gY29udmVyc29yX3Blc29zJGAkTGV5YCwNCiAgICAgICAgIHVuaWRhZCA9ICJhcnMvTWlsZXMgZGUgbTMiKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWxfYiAlPiUgc2VsZWN0KGFuaW8sIHRjYykpICU+JSANCiAgbXV0YXRlKHByZWNpb19nYXNfYm9saXZpYV91c2RfaWRlZSA9IHByZWNpb19nYXNfYm9saXZpYV9pZGVlIC90Y2MpDQoNCg0KI3ByZWNpbyBCb2xpdmlhIFlQRkIgZW4gVVNEIChvcmlnaW5hbCkNCiMgYSBtMw0KcHJlY2lvX2V4cG9fYm9saXZpYV91c2RfeXBmYiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1ByZWNpb3MvcHJlY2lvX2V4cG9fYm9saXZpYS54bHN4IikgJT4lDQogIG11dGF0ZV9hdCgudmFycyA9IGMoInByZWNpb19leHBvX2JvbGl2aWFfYXJnX2dhcyIsICJwcmVjaW9fZXhwb19ib2xpdmlhX2J6bF9nYXMiKSwNCiAgICAgICAgICAgIC5mdW5zID0gZnVuY3Rpb24oeCkge2NvbnZlcnNvcl9mdDNtM19wKHgpfSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIlVTRC9NaWxlcyBkZSBtMyIpDQoNCg0KIyBhIE1NIEJUVQ0KcHJlY2lvX2V4cG9fYm9saXZpYV91c2RfTU1CVFVfeXBmYiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1ByZWNpb3MvcHJlY2lvX2V4cG9fYm9saXZpYS54bHN4IikgJT4lDQogIG11dGF0ZV9hdCgudmFycyA9IGMoInByZWNpb19leHBvX2JvbGl2aWFfYXJnX2dhcyIsICJwcmVjaW9fZXhwb19ib2xpdmlhX2J6bF9nYXMiKSwNCiAgICAgICAgICAgIC5mdW5zID0gZnVuY3Rpb24oeCkge2NvbnZlcnNvcl9mdDNNTUJUVV9wKHgvMTAwMCl9KSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiVVNEL01NQlRVIikgJT4lIA0KICByZW5hbWUocHJlY2lvX2V4cG9fYm9saXZpYV9hcmdfeXBmYiA9IHByZWNpb19leHBvX2JvbGl2aWFfYXJnX2dhcywNCiAgICAgICAgIHByZWNpb19leHBvX2JvbGl2aWFfYnpsX3lwZmIgPSBwcmVjaW9fZXhwb19ib2xpdmlhX2J6bF9nYXMpICANCg0KDQojcHJlY2lvIGJvbGl2aWEgZW4gcGVzb3MgDQojc3VtYXJsZSBlbCBmbGV0ZSA9IDAuMDI0MTI5Nzk0DQpwcmVjaW9fZXhwb19ib2xpdmlhX3Blc29zX3lwZmIgPC0gIHByZWNpb19leHBvX2JvbGl2aWFfdXNkX3lwZmIgJT4lIA0KICAgIGxlZnRfam9pbih0Y3BfYW51YWwpICU+JQ0KICBtdXRhdGUocHJlY2lvX2V4cG9fYm9saXZpYV9hcmdfZ2FzX3Blc29zID0gcHJlY2lvX2V4cG9fYm9saXZpYV9hcmdfZ2FzICogVENDICwgDQogICAgICAgICBwcmVjaW9fZXhwb19ib2xpdmlhX2J6bF9nYXNfcGVzb3MgPSBwcmVjaW9fZXhwb19ib2xpdmlhX2J6bF9nYXMgKiBUQ0MsDQogICAgICAgICB1bmlkYWQgPSAiYXJzL01pbGVzIGRlIG0zIikNCg0KDQojcHJlY2lvIGltcG8gZGUgYXJnZW50aW5hIGRlc2RlIGJvbGl2aWEgVU4gQ29tdHJhZGUNCmdhc19pbXBvX2JvbGl2aWFfY29tdHJhZGVfdXNkIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9VTiBDb210cmFkZS9yZXN1bHRhZG9zL2dhc19pbXBvX2JvbGl2aWFfY29tdHJhZGUuY3N2IikgJT4lDQogIHNlbGVjdChQZXJpb2QsICJUcmFkZSBGbG93IiwgUmVwb3J0ZXIsIFBhcnRuZXIsICJDb21tb2RpdHkgQ29kZSIsIENvbW1vZGl0eSwNCiAgICAgICAgIFF0eSwgdHJhZGVfdmFsdWVfdXNkLCBwcmVjaW9faW1wb19nYXNfYm9saXZpYSwgdW5pZGFkX3ByZWNpbywgdW5pZGFkX2NhbnRpZGFkKSAlPiUgDQogIHJlbmFtZShhbmlvID0gUGVyaW9kKSAlPiUgDQogIG11dGF0ZShwcmVjaW9faW1wb19nYXNfYm9saXZpYV9NTUJUVV9jb210cmFkZSA9IGNvbnZlcnNvcl9tM01NQlRVX3AocHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWEpLA0KICAgICAgICAgdW5pZGFkID0gIlVTRC9NTUJUVSIpDQoNCiNwYXNhamUgYSBwZXNvcw0KZ2FzX2ltcG9fYm9saXZpYV9jb210cmFkZSA8LSBnYXNfaW1wb19ib2xpdmlhX2NvbXRyYWRlX3VzZCAgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsX2IsIGJ5ID0gImFuaW8iKSAlPiUgDQogIG11dGF0ZShwcmVjaW9faW1wb19nYXNfYm9saXZpYSA9IHByZWNpb19pbXBvX2dhc19ib2xpdmlhICogdGNjLA0KICAgICAgICAgdW5pZGFkX3ByZWNpbyA9ICJhcnMvTWlsZXMgZGUgbTMiKQ0KDQoNCiNwcmVjaW8gZXhwbyBib2xpdmlhIFVOIENPTVRSQURFDQpnYXNfZXhwb19ib2xpdmlhX2NvbXRyYWRlX3VzZCA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvVU4gQ29tdHJhZGUvcmVzdWx0YWRvcy9nYXNfZXhwb19ib2xpdmlhX2NvbXRyYWRlLmNzdiIpICU+JQ0KICBzZWxlY3QoUGVyaW9kLCAiVHJhZGUgRmxvdyIsIFJlcG9ydGVyLCBQYXJ0bmVyLCAiQ29tbW9kaXR5IENvZGUiLCBDb21tb2RpdHksDQogICAgICAgICBRdHksIHRyYWRlX3ZhbHVlX3VzZCwgcHJlY2lvX2V4cG9fZ2FzX2JvbGl2aWEsIHVuaWRhZF9wcmVjaW8sIHVuaWRhZF9jYW50aWRhZCkgJT4lIA0KICByZW5hbWUoYW5pbyA9IFBlcmlvZCkgJT4lIA0KICAgbXV0YXRlKHByZWNpb19leHBvX2dhc19ib2xpdmlhX2FyZ19NTUJUVV9jb210cmFkZSA9IGNvbnZlcnNvcl9tM01NQlRVX3AocHJlY2lvX2V4cG9fZ2FzX2JvbGl2aWEpLA0KICAgICAgICAgdW5pZGFkID0gIlVTRC9NTUJUVSIpDQoNCiNwYXNhamUgYSBwZXNvcw0KZ2FzX2V4cG9fYm9saXZpYV9jb210cmFkZSA8LSAgZ2FzX2V4cG9fYm9saXZpYV9jb210cmFkZV91c2QgJT4lDQogIGxlZnRfam9pbih0Y3BfYW51YWxfYiwgYnkgPSAiYW5pbyIpICU+JSANCiAgbXV0YXRlKHByZWNpb19leHBvX2dhc19ib2xpdmlhID0gcHJlY2lvX2V4cG9fZ2FzX2JvbGl2aWEgKiB0Y2MsDQogICAgICAgICB1bmlkYWRfcHJlY2lvID0gImFycy9NaWxlcyBkZSBtMyIpDQpgYGANCg0KIyMjIyMgVG9kb3MgbG9zIHByZWNpb3MNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojUHJlY2lvIGRlIGV4cG9ydGFjaW9uIHkgcmVmZXJlbmNpYSBkZSBHYXMuIE1lcmdlIGRlIGJhc2VzDQoNCiNwcmVjaW9zIGVuIHVzZA0KcHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVIDwtIHByaWNlX2VldXVfTU1CVFUgJT4lIA0KICBsZWZ0X2pvaW4oICBoZW5yeV9odWIpICU+JQ0KICBsZWZ0X2pvaW4oYnBfZ2FzX3ByaWNlcykgJT4lIA0KICBsZWZ0X2pvaW4oZm1pX2dhc19wcmljZSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX2V4cG9fYm9saXZpYV91c2RfTU1CVFVfeXBmYikgJT4lIA0KICBsZWZ0X2pvaW4oZ2FzX2ltcG9fYm9saXZpYV9jb210cmFkZV91c2QgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9faW1wb19nYXNfYXJnX2JvbGl2aWFfY29tdHJhZGUgPSBwcmVjaW9faW1wb19nYXNfYm9saXZpYV9NTUJUVV9jb210cmFkZSkpICU+JSANCiAgbGVmdF9qb2luKGdhc19leHBvX2JvbGl2aWFfY29tdHJhZGVfdXNkICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgDQogICAgICAgICAgICAgICAgICAgICBwcmVjaW9fZXhwb19nYXNfYm9saXZpYV9hcmdfY29tdHJhZGUgPSBwcmVjaW9fZXhwb19nYXNfYm9saXZpYV9hcmdfTU1CVFVfY29tdHJhZGUpKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9faWRlZV9pbXBvX2dhcyAlPiUgc2VsZWN0KGFuaW8sIHByZWNpb19nYXNfYm9saXZpYV91c2RfaWRlZSkpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb19leHBvX2dhc191c2QpICU+JSANCiAgbXV0YXRlKHByZWNpb19pbXBvX2dhc19ib2xpdmlhX2lkZWUgPSBjb252ZXJzb3JfbTNNTUJUVV9wKHByZWNpb19nYXNfYm9saXZpYV91c2RfaWRlZS8xMDAwKSwjb2sNCiAgICAgICAgIHByZWNpb19leHRlcm5vX2dhcyA9IGNhc2Vfd2hlbiggYW5pbyA8IDE5NjYgfiBwcmVjaW9faW1wb19nYXNfYXJnX2JvbGl2aWFfY29tdHJhZGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR+IHByZWNpb19leHBvX2dhc19ib2xpdmlhX2FyZ19jb210cmFkZSksDQogICAgICAgICBwcmVjaW9fZXhwb3J0YWNpb25fZ2FzX2FyID0gY2FzZV93aGVuKGFuaW8gPDE5OTkgfnByZWNpb19leHBvX2dhc19jb210cmFkZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+PSAxOTk5IH4gcHJlY2lvX2V4cG9fZ2FzX3JlZ2FsaWFzKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fZXh0ZXJub19nYXMsIGV2ZXJ5dGhpbmcoLiksIC1wcmVjaW9fZ2FzX2JvbGl2aWFfdXNkX2lkZWUpICU+JSANCiAgZmlsdGVyKGFuaW8gPCAyMDIxKQ0KDQpwcmVjaW9fbWRvbXVuZGlhbF9nYXNfYmVwIDwtIHByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSAlPiUNCiAgc2VsZWN0KC11bmlkYWQpICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBtdXRhdGVfYWxsKGNvbnZlcnNvcl9NTUJUVWJlcF9wKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiVVNEL2JlcCIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSkNCg0KY29tcGFyYWNpb25fYmVwIDwtIHByZWNpb19tZG9tdW5kaWFsX2dhc19iZXAgJT4lIA0KICAgICMgc2VsZWN0KGFuaW8sIHByZWNpb19leHRlcm5vX2dhcykgJT4lDQogIGxlZnRfam9pbihwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGJyZW50X2hpc3RvcmljLCB3dGlfc3BvdF9wcmljZV9mcmVkLA0KICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2V4cG9fY29tdHJhZGVfc2l0Y19jcnVkbykpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJVU0QvYmVwIikNCiAgDQojIHByZWNpb19tZG9tdW5kaWFsX2dhc19NbTMgPC0gcHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVICU+JQ0KIyAgIHNlbGVjdCgtdW5pZGFkKSAlPiUgDQojICAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KIyAgIG11dGF0ZV9hbGwoY29udmVyc29yX20zTU1CVFVfcCkgJT4lIA0KIyAgIG11dGF0ZSh1bmlkYWQgPSAiVVNEL2JlcCIpICU+JSANCiMgICBzZWxlY3QoYW5pbywgdW5pZGFkLCBldmVyeXRoaW5nKC4pKQ0KICANCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoTU1CVFUgPSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgQkVQID0gcHJlY2lvX21kb211bmRpYWxfZ2FzX2JlcCksIHBhdGggPSAicmVzdWx0YWRvcy9wcmVjaW9fbWRvX211bmRpYWxfZ2FzLnhsc3giKQ0KDQojZ3JhZmljbyBwcmVjaW9zIGJlcA0KZ3JhZl9wcmVjaW9fbWRvX211bmRpYWxfZ2FzX2JlcCA8LSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfYmVwICU+JSANCiAgc2VsZWN0KC1wcmVjaW9fZXh0ZXJub19nYXMpICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fcHJlY2lvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDM6bmNvbCguKSkgJT4lDQogICMgZmlsdGVyKCEodGlwb19wcmVjaW8gJWluJSBjKCJwcmVjaW9fZ2FzX2JvbGl2aWFfdXNkX2lkZWUiLCAicHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWFfTU1CVFVfY29tdHJhZGUiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlY2lvX2V4cG9fZ2FzX2NvbXRyYWRlIiwgInByZWNpb19leHBvX2dhc19pbmRlYyIpKSkgJT4lDQogIGZpbHRlcighKHRpcG9fcHJlY2lvICVpbiUgYygicHJlY2lvX2V4cG9fZ2FzX2luZGVjIikpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGFuaW8sIHkgPSB2YWxvciwgY29sb3IgPSB0aXBvX3ByZWNpbykpKw0KICBnZW9tX2xpbmUoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh5ID0gIlVTRC9iZXAiKQ0KIyBwbG90bHk6OmdncGxvdGx5KGdyYWZfcHJlY2lvX21kb19tdW5kaWFsX2dhc19iZXApDQoNCmdyYWZfcHJlY2lvX21kb19tdW5kaWFsX2dhc19tbWJ0dSA8LSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUgJT4lIA0KICBmaWx0ZXIocHJlY2lvX2V4dGVybm9fZ2FzIDwgMjUpICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fcHJlY2lvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDM6bmNvbCguKSkgJT4lDQogIGZpbHRlcigNCiAgICB2YWxvciA8IDI1LA0KICAgICEodGlwb19wcmVjaW8gJWluJSBjKCJicF9vaWxfbWl4X21lYW5fb2VjZCINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgLCAicHJlY2lvX2V4cG9fZ2FzX2luZGVjIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAicHJlY2lvX2dhc19ib2xpdmlhX3VzZF9pZGVlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgInByZWNpb19pbXBvX2dhc19hcmdfYm9saXZpYV9jb210cmFkZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJwcmVjaW9fZXhwb19nYXNfY29tdHJhZGUiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSkgJT4lDQogICMgZmlsdGVyKCEodGlwb19wcmVjaW8gJWluJSBjKCJwcmVjaW9fZXhwb19nYXNfaW5kZWMiKSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYW5pbywgeSA9IHZhbG9yLCBjb2xvciA9IHRpcG9fcHJlY2lvKSkrDQogIGdlb21fbGluZSgpICsNCiAgIyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpKw0KICBsYWJzKHRpdGxlID0gIlByZWNpb3MgZGUgZXhwb3J0YWNpw7NuIHkgcmVmZXJlbmNpYSBkZWwgbWVyY2FkbyBtdW5kaWFsIGRlbCBnYXMiLCANCiAgICAgICB5ID0gIlVTRC9NTUJUVSIpDQpnZ3Bsb3RseShncmFmX3ByZWNpb19tZG9fbXVuZGlhbF9nYXNfbW1idHUsIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQoNCg0KI3ByZWNpb3MgZW4gYXJzLiBJTkNPTVBMRVRPDQpwcmVjaW9fZXhwb195X21lX2dhcyA8LSBwcmVjaW9fZXhwb19nYXMgJT4lDQogIGZ1bGxfam9pbihwcmVjaW9faWRlZV9pbXBvX2dhcyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19nYXNfYm9saXZpYV9pZGVlKSkgJT4lIA0KICBmdWxsX2pvaW4ocHJlY2lvX2V4cG9fYm9saXZpYV9wZXNvc195cGZiICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgDQogICAgICAgICAgICAgICAgICAgICBwcmVjaW9fYm9saXZpYV95cGZiID0gcHJlY2lvX2V4cG9fYm9saXZpYV9hcmdfZ2FzX3Blc29zICkpICU+JSANCiAgZnVsbF9qb2luKGdhc19pbXBvX2JvbGl2aWFfY29tdHJhZGUgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX3ByZWNpbywNCiAgICAgICAgICAgICAgICAgICAgIHByZWNpb19pbXBvX2dhc19ib2xpdmlhX2NvbXRyYWRlID0gcHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWEgKSkgJT4lIA0KICBsZWZ0X2pvaW4oZ2FzX2V4cG9fYm9saXZpYV9jb210cmFkZSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQgPSB1bmlkYWRfcHJlY2lvLCANCiAgICAgICAgICAgICAgICAgICAgIHByZWNpb19leHBvX2dhc19ib2xpdmlhX2NvbXRyYWRlID0gcHJlY2lvX2V4cG9fZ2FzX2JvbGl2aWEgKSkgJT4lDQogIGxlZnRfam9pbihoZW5yeV9odWIpICU+JSANCiAgYXJyYW5nZShhbmlvKQ0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gocHJlY2lvX2V4cG9feV9tZV9nYXMsIHBhdGggPSAicHJlY2lvX2V4cG9feV9tZG9fbXVuZGlhbF9nYXMueGxzeCIpDQojIHdyaXRleGw6OndyaXRlX3hsc3goY29tcGFyYWNpb25fYmVwLCBwYXRoID0gImNvbXBhcmFjaW9uX2JlcC54bHN4IikNCg0KDQpjb21wYXJhY2lvbl9wcmVjaW9zIDwtIHByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19leHRlcm5vX2dhcykgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX2ludGVybm9fZ2FzX21tYnR1X3VzZCAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19nYXNfbWRvaW50KSkNCiANCmBgYA0KYnVzY2Ftb3MgdW4gcHJlY2lvDQoNCmN1YW50byBlcyB1bmEgY2FudGlkYWQgZGUgYnR1IGRlIGdhcyBhbCBwcmVjaW8gZGUgcmVmZXJlbmNpYSAoZWogYm9saXZpYSkgeSBjdWFudG8gZXMgc2kgY29udmllcnRvIGVzb3MgYnR1IGEgYmFycmlsZXMgeSBsb3MgdmFsb3Jpem8gY29uIGVsIHByZWNpbyBkZWwgYmFycmlsPyBjdWFudG8gcXVlZGEgbGEgdW5pZGFkIGVuIGJ0dSBzaSB0b21vIGVsIHByZWNpbyBkZSBwZXRyb2xlbyB5IGxvIGNvdmllcnRvIGEgYnR1LiANCmVzIGRlY2lyLCBjdWFudG8gZXMgZWwgdmFsb3Igc2kgbGEgdmFsb3Jpem8gZW4gcHJlY2lvIGRlbCBwZXRyb2xlbw0KDQrCv2N1YW50b3MgdXNkIGVzIHVuIGJ0dSBkZSBwZXRyb2xlbz8NCnNpIHRvbW8gdW4gYmFycmlsIGRlIHBldHJvbGVvIHkgbG8gY29udmllcnRvIGEgYnR1ICggbWUgdmEgYSBkYXIgY3VhbnRvcyBVU0QgZXMgdW4gYnR1KQ0KbHVlZ28gY29tcGFybyBsb3MgVVNEL2J0dSB5IGxvIGNvbXBhcm8gY29uIGVsIGdhcyBkZSBib2xpdmlhDQoNCmdyaW5iZXI6IGNvbnZpZXJ0ZSB0b2RvIGVsIGdhcyBlbiBwZXRyb2xlbyB5IGxlIHBvbmUgZWwgcHJlY2lvIGRlIHBldHJvZWxvZS4gc3ViZXN0aW1hIGxvcyBwcmVjaW9zIGRlbCBnYXM/DQoNCmBgYHtyfQ0KcHJlY2lvX2NydWRvX3ZzX2dhcyA8LSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfYmVwICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX2V4dGVybm9fZ2FzKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KC11bmlkYWQpICU+JSANCiAgICAgICAgICAgICAgZ2F0aGVyKGtleSA9IHRpcG9fcHJlY2lvX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWUgICA9IHByZWNpb19jcnVkb191c2RfYmJsLA0KICAgICAgICAgICAgICAgICAgICAgMjpuY29sKC4pKSwgYnkgPSJhbmlvIikgJT4lIA0KICBtdXRhdGUocHJlY2lvX2NydWRvX3NvYnJlX2dhcyA9cHJlY2lvX2NydWRvX3VzZF9iYmwvcHJlY2lvX2V4dGVybm9fZ2FzKSAlPiUgDQogIGZpbHRlcighKGlzLm5hKHByZWNpb19jcnVkb19zb2JyZV9nYXMpKSwgDQogICAgICAgICAhKHRpcG9fcHJlY2lvX2NydWRvICVpbiUgYygid3RpX3Nwb3RfcHJpY2VfZnJlZCIsICJwcmVjaW9fbWVfY3J1ZG8iKSkgICkNCiAgICAgICAgICMgKHRpcG9fcHJlY2lvX2NydWRvICVpbiUgYygiYnJlbnRfaWVhIikpICApDQogICAgICAgICAjICh0aXBvX3ByZWNpb19jcnVkbyAlaW4lIGMoImJyZW50X2llYSIsICJicmVudF9oaXN0b3JpYyIpKSAgKQ0KcHJlY2lvX2NydWRvX3ZzX2dhcw0KDQpncmFmIDwtICBwcmVjaW9fY3J1ZG9fdnNfZ2FzICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCBwcmVjaW9fY3J1ZG9fc29icmVfZ2FzLCBjb2xvcj10aXBvX3ByZWNpb19jcnVkbykpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh0aXRsZSA9ICJwcmVjaW8gZGVsIGNydWRvIHNvYnJlIGVsIGRlbCBnYXMgKGFtYm9zIGVuIGJhcnJpbGVzKSIpDQoNCmdncGxvdGx5KGdyYWYsIHdpZHRoID0gODAwLCBsZW5ndGg9NjAwKQ0KIyBncmFmDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChwcmVjaW9fY3J1ZG9fdnNfZ2FzLCBwYXRoPSAicHJlY2lvIGRlbCBjcnVkbyB2cyBnYXMueGxzeCIpICANCmBgYA0KDQoNCg0KIyMgRXhwb3J0YWNpb25lcyBlIEltcG9ydGFjaW9uZXMNCg0KKiBGdWVudGVzDQogICsgW1NFU0NPIERvd25zdHJlYW1dKGh0dHBzOi8vZGF0b3MuZ29iLmFyL2RhdGFzZXQvZW5lcmdpYS1yZWZpbmFjaW9uLWNvbWVyY2lhbGl6YWNpb24tcGV0cm9sZW8tZ2FzLWRlcml2YWRvcy10YWJsYXMtZGluYW1pY2FzKQ0KICArIElOREVDDQogICsgTUVDT04NCiAgKyBVTkNvbXRyYWRlDQoNCiMjIyMgRXhwb3J0YWNpb25lcyBlIEltcG9ydGFjaW9uZXMgZGUgQ3J1ZG8NCiogRXhwb3J0YWNpb25lcyBkZSBDcnVkbzogDQogICsgMTk2MiBhIDE5OTM6IFVOIENvbXRyYWRlDQogICsgMTk5NCBlbiBhZGVsYW50ZTogU0VTQ08gRG93bnN0cmVhbQ0KICArIExvcyBkYXRvcyBmYWx0YW50ZXMgZGUgU0VTQ08gc2UgY29tcGxldGFyb24gY29uIE1FQ09ODQogICsgU2lndWVuIGhhYmllbmRvIGRhdG9zIGZhbHRhbnRlcyBwYXJhIGxvcyBhw7FvcyAxOTY1LCAxOTcwLTc0LCAxOTc2LTc4LCAxOTgwLTg0DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMgU0VTQ08NCiNjYW50aWRhZGVzLiBwb3N0IDIwMTAgKGhhc3RhIDIwMTkpDQppbXBvcnRhY2lvbmVzX2V4cG9ydGFjaW9uZXMgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvU0VTQ08vUmVmaW5hY2nDs24geSBjb21lcmNpYWxpemFjaW9uL2ltcG9ydGFjaW9uZXMtZXhwb3J0YWNpb25lcy5jc3YiKQ0KDQojIGNhbnRpZGFkZXMuIHBvc3QgMjAxNiANCmltcG9ydGFjaW9uZXNfZXhwb3J0YWNpb25lc19wb3N0MjAxNiA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9TRVNDTy9SZWZpbmFjacOzbiB5IGNvbWVyY2lhbGl6YWNpb24vaW1wb3J0YWNpb25lcy1leHBvcnRhY2lvbmVzLWEtcGFydGlyLWRlbC0yMDE2LS5jc3YiKQ0KDQojIyMjY29tZXJjaW8gZXh0ZXJpb3IgcG9zdCAyMDEwOiAiVERfY29tZXJjaW9fZXh0ZXJpb3IueGxzeCINCmNvbWV4X3Bvc3QyMDEwIDwtIHJlYWRfZGVsaW0oIi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL2RhdGFzZXRzL2NvbWV4X3Bvc3QyMDEwLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSwgDQogICAgc2tpcCA9IDUpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9IGNhc2Vfd2hlbihEYXRvcyA9PSAiU3VtYSBkZSBtb250byIgfiAiVVNEIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdW5pZGFkKSwNCiAgICAgICAgIAl1bmlkYWQgPSBzdHJfcmVtb3ZlX2FsbCgJdW5pZGFkLCAiWygpXSIgKSwNCiAgICAgICAgIGZlY2hhID0gYXMuRGF0ZShwYXJzZV9kYXRlX3RpbWUocGFzdGUwKGFuaW8sIG1lcyksIG9yZGVycyA9ICJ5bSIpKSkgJT4lICANCiAgZmlsdGVyKCFpcy5uYShhbmlvKSkgJT4lIA0KICByZW5hbWUoZXhwb3J0YWNpb24gPSAiRXhwb3J0YWNpw7NuIiwNCiAgICAgICAgIGltcG9ydGFjaW9uID0gIkltcG9ydGFjacOzbiIpICU+JSANCiAgc2VsZWN0KGZlY2hhLCBhbmlvLCBtZXMsIGV2ZXJ5dGhpbmcoLiksIC1jKCJUb3RhbCBnZW5lcmFsIiwgRGF0b3MpKSAlPiUgDQogIGdhdGhlciguLA0KICAgICAgICAga2V5ID0gdmFyaWFibGUsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgNjo3KQ0KDQojb3RyYSBiYXNlLiBzb2xvIGNhbnRpZGFkZXMuIHZlciBkZSBkb25kZSBhcGFyZWNpw7MNCmltcG9fZXhwbyA8LSByZWFkX2NzdigiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvaW1wb3J0YWNpb25lcy1leHBvcnRhY2lvbmVzICgxKS5jc3YiKQ0KDQoNCiMjI2V4cG9ydGFjaW9uZXMgcHJlIDIwMTA6ICJFeHBvcnRhY2lvbmVzLnhsc3giDQpleHBvX3ByZTIwMTAgPC0gcmVhZF9kZWxpbSgiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvZXhwb19wcmUyMDEwLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw7FvIiwNCiAgICAgICAgIG1lcyA9ICJNZXMiLA0KICAgICAgICAgcHJvZHVjdG8gPSBQcm9kdWN0bywNCiAgICAgICAgIHZhbG9yID0gVG90YWwpICU+JSANCiAgbXV0YXRlKGFuaW8gPSB6b286Om5hLmxvY2YoYW5pbyksDQogICAgICAgICBtZXMgPSB6b286Om5hLmxvY2YobWVzKSwNCiAgICAgICAgIHByb2R1Y3RvID0gem9vOjpuYS5sb2NmKHByb2R1Y3RvKSwNCiAgICAgICAgIHZhcmlhYmxlID0gImV4cG9ydGFjaW9uIiwNCiAgICAgICAgIGZlY2hhID0gYXMuRGF0ZShwYXJzZV9kYXRlX3RpbWUocGFzdGUwKGFuaW8sIG1lcyksIG9yZGVycyA9ICJ5bSIpKSwNCiAgICAgICAgIHVuaWRhZCA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KERhdG9zLCAiTTMiKSB+ICJtMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChEYXRvcywgIlRvbiIpIH4gInRvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChEYXRvcywgIkZPQiIpIH4gIlVTRCIpKSAlPiUgDQogIHNlbGVjdChmZWNoYSwgZXZlcnl0aGluZyguKSwgLWMoRGF0b3MpKQ0KDQojbm8gc2UgZGUgZG9uZGUgc2FsacOzIGVzdGUgcGVybyBoYWJyaWEgcSByYXN0cmVhcmxvDQpleHBvX3VzZF90b24gPC0gcmVhZF9kZWxpbSgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9kYXRhc2V0cy9leHBvX3VzZF90b24uY3N2IiwgDQogICAgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFLCANCiAgICBza2lwID0gMykNCg0KIyMjaW1wb3J0YWNpb25lcyBwcmUgMjAxMDogIkltcG9ydGFjaW9uZXMueGxzeCINCmltcG9fcHJlMjAxMCA8LSByZWFkX2RlbGltKCIvQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9kYXRhc2V0cy9pbXBvX3ByZTIwMTAuY3N2IiwgDQogICAgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUgDQogIHJlbmFtZShhbmlvID0gIkHDsW8iLA0KICAgICAgICAgbWVzID0gIk1lcyIsDQogICAgICAgICBwcm9kdWN0byA9IFByb2R1Y3RvLA0KICAgICAgICAgdmFsb3IgPSBUb3RhbCkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IHpvbzo6bmEubG9jZihhbmlvKSwNCiAgICAgICAgIG1lcyA9IHpvbzo6bmEubG9jZihtZXMpLA0KICAgICAgICAgcHJvZHVjdG8gPSB6b286Om5hLmxvY2YocHJvZHVjdG8pLA0KICAgICAgICAgdmFyaWFibGUgPSAiaW1wb3J0YWNpb24iLA0KICAgICAgICAgZmVjaGEgPSBhcy5EYXRlKHBhcnNlX2RhdGVfdGltZShwYXN0ZTAoYW5pbywgbWVzKSwgb3JkZXJzID0gInltIikpLA0KICAgICAgICAgdW5pZGFkID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoRGF0b3MsICJNMyIpIH4gIm0zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KERhdG9zLCAiVG9uIikgfiAidG9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KERhdG9zLCAiRk9CIikgfiAiVVNEIikpICU+JSANCiAgc2VsZWN0KGZlY2hhLCBldmVyeXRoaW5nKC4pLCAtYyhEYXRvcykpDQojIGltcG9fcHJlMjAxMA0KDQoNCiNCYXNlIHVuaWRhIGRlIFNFU0NPDQpjb21lcmNpb19leHRlcmlvciA8LSBjb21leF9wb3N0MjAxMCAlPiUgDQogIGJpbmRfcm93cyhpbXBvX3ByZTIwMTAsIGV4cG9fcHJlMjAxMCkgJT4lIA0KICBhcnJhbmdlKGZlY2hhKSAlPiUgDQogIG11dGF0ZSh2YWxvciA9IGNhc2Vfd2hlbih1bmlkYWQgPT0gIm1pbGVzL20zIiB+IHZhbG9yICogMTAwMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB2YWxvciksDQogICAgICAgICB1bmlkYWQgPSBjYXNlX3doZW4odW5pZGFkID09ICJtaWxlcy9tMyIgfiAibTMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB1bmlkYWQpKQ0KDQojZXhwbyBlIGltcG8gZGUgQ3J1ZG8uIGNhbnRpZGFkZXMgeSB2YWxvcg0KY29tZXhfY3J1ZG9fc2VzY28gPC0gY29tZXJjaW9fZXh0ZXJpb3IgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChwcm9kdWN0bywgIlBFVFJPTEVPIikgfCBzdHJfZGV0ZWN0KHByb2R1Y3RvLCAiQ3VlbmNhIiksDQogICAgICAgICB1bmlkYWQgIT0gIlRvbiIpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdmFyaWFibGUsIHVuaWRhZCkgJT4lIA0KICBzdW1tYXJpc2UodmFsb3IgPSBzdW0odmFsb3IsIG5hLnJtID0gVCkpICU+JSANCiAgbXV0YXRlKHByb2R1Y3RvID0gImNydWRvIiwNCiAgICAgICAgIHZhbG9yID0gY2FzZV93aGVuKHVuaWRhZCA9PSAibTMiIH4gY29udmVyc29yX20zYmJsX3EodmFsb3IpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHZhbG9yKSwNCiAgICAgICAgIHVuaWRhZCA9IGNhc2Vfd2hlbih1bmlkYWQgPT0gIm0zIiB+ICJiYXJyaWxlcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHVuaWRhZCkpDQoNCg0KI3F1w6kgcHJvZHVjdG9zIGVudHJhbiBlbiBlbCBmaWx0cm8gZGUgY3J1ZG8/DQojIHVuaXF1ZSgoY29tZXJjaW9fZXh0ZXJpb3IgJT4lIGZpbHRlcihzdHJfZGV0ZWN0KHByb2R1Y3RvLCAiUEVUUk9MRU8iKSB8IHN0cl9kZXRlY3QocHJvZHVjdG8sICJDdWVuY2EiKSkpJHByb2R1Y3RvKQ0KDQoNCiNNRUNPTg0KY29tZXhfaGlkcm9jYXJidXJvc19tZWNvbiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL01lY29uL2Jhc2UtbWluZXJpYS1lLWhpZHJvY2FyYnVyb3MgY3VlbnRhcyBuYWNpb25hbGVzLnhscyIsIA0KICAgIHNoZWV0ID0gIkNvbS4gZXh0ZXJpb3IiLCBza2lwID0gNykgJT4lDQogIHJlbmFtZShhbmlvID0gJy4uLjEnICwNCiAgICAgICAgIGV4cG9fTW0zX2NydWRvID0gJ0V4cG9ydGFjaW9uZXMuLi4yJywNCiAgICAgICAgIGltcG9fTW0zX2NydWRvID0gJ0ltcG9ydGFjaW9uZXMuLi4zJywNCiAgICAgICAgIHNhbGRvX01tM19jcnVkbyA9IGBCYWxhbmNlIChYLU0pLi4uNGAsDQogICAgICAgICBleHBvX01NbTNfZ2FzID0gJ0V4cG9ydGFjaW9uZXMuLi41JywNCiAgICAgICAgIGltcG9fTW0zX2dhcyA9ICdJbXBvcnRhY2lvbmVzLi4uNicsDQogICAgICAgICBzYWxkb19NbTNfZ2FzID0gYEJhbGFuY2UgKFgtTSkuLi43YCwNCiAgICAgICAgIGV4cG9fbWV0YWxpZmVyb3Nfb3Ryb3NfTU11c2QgPSBgTWluZXJhbGVzIG1ldGFsw61mZXJvcywgZXNjb3JpYXMgeSBjZW5pemFzYCwNCiAgICAgICAgIGV4cG9fY3J1ZG9fTU11c2QgPSBgUGV0csOzbGVvIGNydWRvYCwNCiAgICAgICAgIGV4cG9fZ2FzX01NdXNkID0gYEdhcyBkZSBwZXRyw7NsZW8geSBvdHJvcyBoaWRyb2NhcmJ1cm9zYCwNCiAgICAgICAgIGV4cG9fY2FyYnVyYW50ZXNfb3Ryb3NfTU11c2QgPSBgQ2FyYnVyYW50ZXMsIGdyYXNhcyB5IGFjZWl0ZXMgbHVicmljYW50ZXNgLA0KICAgICAgICAgZXhwb19lbGVjdHJpY2FfTU11c2QgPSBgRW5lcmfDrWEgZWzDqWN0cmljYWAsDQogICAgICAgICBleHBvX3Jlc3RvX2NvbWJ1c3RpYmxlc19NTXVzZCA9IGBSZXN0byBkZSBjb21idXN0aWJsZXNgKSAlPiUgDQogIGZpbHRlcighaXMubmEoYW5pbyApKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKSAlPiUgDQogIG11dGF0ZShleHBvX2JibF9jcnVkbyA9IGNvbnZlcnNvcl9tM2JibF9xKGV4cG9fTW0zX2NydWRvKjEwMDApLA0KICAgICAgICAgaW1wb19iYmxfY3J1ZG8gPSBjb252ZXJzb3JfbTNiYmxfcShpbXBvX01tM19jcnVkbyoxMDAwKSwNCiAgICAgICAgIHNhbGRvX2JibF9jcnVkbyA9IGNvbnZlcnNvcl9tM2JibF9xKHNhbGRvX01tM19jcnVkbyoxMDAwKSkNCg0KDQojSU5ERUMgLSBDb21FeA0KI2NhbnRpZGFkZXMNCmNhbnRpZGFkZXNfZXhwb19oaWRyb19pbmRlYyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSU5ERUMvQ29tRXgvY2FudGlkYWRlc19leHBvX2hpZHJvX2luZGVjLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkgJT4lIA0KICByZW5hbWUoZXhwb19pbmRlY19jcnVkbyA9IHBldHJvbGVvX2NydWRvX2V4cG8sDQogICAgICAgICAgIGV4cG9faW5kZWNfZ2FzICA9IGdhc19uYXR1cmFsX2V4cG8pDQoNCiN2YWxvcg0KZXhwb19oaWRyb192YWxvcl9pbmRlYyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSU5ERUMvQ29tRXgvZXhwb19oaWRyb192YWxvci5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpICU+JSANCiAgcmVuYW1lKGV4cG9faW5kZWNfY3J1ZG8gPSBwZXRyb2xlb19jcnVkb19leHBvLA0KICAgICAgICAgICBleHBvX2luZGVjX2dhcyAgPSBnYXNfbmF0dXJhbF9leHBvKQ0KDQoNCg0KI01lcmdlIGRlIGJhc2VzDQojQ3J1ZG8gZXhwbyBjYW50aWRhZA0KZXhwb19xX2NydWRvIDwtIGNvbWV4X2NydWRvX3Nlc2NvICU+JQ0KICBmaWx0ZXIodmFyaWFibGUgPT0gImV4cG9ydGFjaW9uIiwNCiAgICAgICAgIHVuaWRhZCA9PSAiYmFycmlsZXMiKSAlPiUNCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgdmFsb3IpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgcmVuYW1lKGV4cG9fc2VzY29fY3J1ZG8gPSB2YWxvcikgJT4lIA0KICBsZWZ0X2pvaW4oY29tZXhfaGlkcm9jYXJidXJvc19tZWNvbiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBleHBvX21lY29uX2NydWRvID0gZXhwb19iYmxfY3J1ZG8pKSAlPiUgDQogIGxlZnRfam9pbihjYW50aWRhZGVzX2V4cG9faGlkcm9faW5kZWMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoLWV4cG9faW5kZWNfZ2FzKSkgJT4lIA0KICBmdWxsX2pvaW4oZXhwb19jcnVkb19zaXRjICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCA9IHVuaWRhZF9jYW50aWRhZCwgZXhwb19jb210cmFkZV9jcnVkbyA9IGV4cG9fYmJsICkpICU+JSANCiAgbXV0YXRlKGV4cG9fY3J1ZG8gPSBjYXNlX3doZW4oYW5pbyA8IDE5OTkgIH4gZXhwb19jb210cmFkZV9jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhbmlvICVpbiUgMTk5OToyMDE0IH4gZXhwb19tZWNvbl9jcnVkbyAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPj0gMTk5OSB+IGV4cG9fc2VzY29fY3J1ZG8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMubmEoZXhwb19zZXNjb19jcnVkbykgfiBleHBvX21lY29uX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gZXhwb19zZXNjb19jcnVkbyksDQogICAgICAgICB1bmlkYWQgPSAiYmFycmlsZXMiLA0KICAgICAgICAgZGlmID0gZXhwb19jcnVkby9leHBvX2luZGVjX2NydWRvIC0gMSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLGV4cG9fY3J1ZG8sIGV2ZXJ5dGhpbmcoLiksIC12YXJpYWJsZSkgJT4lIA0KICBhcnJhbmdlKGFuaW8pDQoNCg0KIyBNZXJnZSBjcnVkbyBVU0QNCmV4cG9fdXNkX2NydWRvIDwtIGNvbWV4X2NydWRvX3Nlc2NvICU+JSANCiAgZmlsdGVyKHZhcmlhYmxlID09ICJleHBvcnRhY2lvbiIgLCB1bmlkYWQgPT0gIlVTRCIpICU+JSANCiAgcmVuYW1lKGV4cG9fY3J1ZG9fc2VzY28gPSB2YWxvcikgJT4lDQogIGxlZnRfam9pbihjb21leF9oaWRyb2NhcmJ1cm9zX21lY29uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGV4cG9fY3J1ZG9fbWVjb24gPSBleHBvX2NydWRvX01NdXNkKSkgJT4lIA0KICBsZWZ0X2pvaW4oZXhwb19oaWRyb192YWxvcl9pbmRlYyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBleHBvX2luZGVjX2NydWRvKSkgJT4lIA0KICBmdWxsX2pvaW4oZXhwb19jcnVkb19zaXRjICU+JSANCiAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQgPSB1bmlkYWRfdmFsb3IsIGV4cG9fY29tdHJhZGVfY3J1ZG8gPSBleHBvX3VzZF9jb210cmFkZV9jcnVkbykpICU+JQ0KICBtdXRhdGUoZXhwb19jcnVkb19tZWNvbiA9IGV4cG9fY3J1ZG9fbWVjb24gKjEwMDAwMDAsDQogICAgICAgICBleHBvX2NydWRvID0gY2FzZV93aGVuKGFuaW8gPDE5OTQgfiBleHBvX2NvbXRyYWRlX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID49IDE5OTQgfiBleHBvX2NydWRvX3Nlc2NvKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBleHBvX2NydWRvLCBldmVyeXRoaW5nKC4pLCAtYyh2YXJpYWJsZSwgcHJvZHVjdG8pKSAlPiUgDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQpICU+JSANCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSB7eC8xMF42fSkNCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QodXNkID0gZXhwb191c2RfY3J1ZG8sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICMgY2FudGlkYWRlcyA9IGV4cG9fcV9jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAjIHByZWNpb19leHBvcnRhY2lvbl95X3JlZmVyZW5jaWEgPSBwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvKSwgDQogICAgICAgICAgICAgICAgICAgICMgcGF0aCA9ICJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL3Jlc3VsdGFkb3MvZXhwb19jcnVkby54bHN4IikNCg0KZXhwb19xX2NydWRvDQpleHBvX3VzZF9jcnVkbw0KYGBgDQoNCg0KIyMjIyBFeHBvcnRhY2lvbmVzIGUgSW1wb3J0YWNpb25lcyBkZSBHYXMNCiogRnVlbnRlcyBzZWxlY2Npb25hZGFzOg0KICsgMTk2MiBhIDE5OTY6IFVOIENvbXRyYWRlLA0KICsgMTk5NyBlbiBhZGVsYW50ZTogU0VTQ08gRG93bnN0cmVhbQ0KICsgRGF0b3MgZmFsdGFudGVzIHBhcmEgbG9zIGHDsW9zIDE5OTkgeSAyMDAwDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojU0VTQ08NCmNvbWV4X2dhcyA8LSBjb21lcmNpb19leHRlcmlvciAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KHByb2R1Y3RvLCAiR0FTIE5BVFVSQUwiKSB8IHN0cl9kZXRlY3QocHJvZHVjdG8sICJHYXMgTmF0dXJhbCIpIA0KICAgICAgICAgfCBzdHJfZGV0ZWN0KHByb2R1Y3RvLCAiR2FzIGRlIFJlZmluZXLDrWEiKSwNCiAgICAgICAgIHByb2R1Y3RvICE9ICJHYXMgTmF0dXJhbCBMaWN1YWRvIiwNCiAgICAgICAgIHVuaWRhZCAhPSAiVG9uIikgJT4lDQogIGdyb3VwX2J5KGFuaW8sIHZhcmlhYmxlLCB1bmlkYWQpICU+JSANCiAgc3VtbWFyaXNlKHZhbG9yID0gc3VtKHZhbG9yLCBuYS5ybSA9IFQpKSU+JSANCiAgbXV0YXRlKHByb2R1Y3RvID0gImdhcyIpDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KGNvbWV4X2NydWRvX3Nlc2NvICU+JSBmaWx0ZXIodW5pZGFkID09ICJVU0QiLCB2YXJpYWJsZSA9PSAiZXhwb3J0YWNpb24iKSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWV4X2NydWRvX3Nlc2NvICU+JSBmaWx0ZXIodW5pZGFkID09ICJVU0QiLCB2YXJpYWJsZSA9PSAiaW1wb3J0YWNpb24iKSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWV4X2dhcyAlPiUgZmlsdGVyKHVuaWRhZCA9PSAiVVNEIiwgdmFyaWFibGUgPT0gImltcG9ydGFjaW9uIiksDQojICAgICAgICAgICAgICAgICAgICAgICAgICBjb21leF9nYXMgJT4lIGZpbHRlcih1bmlkYWQgPT0gIlVTRCIsIHZhcmlhYmxlID09ICJleHBvcnRhY2lvbiIpKSwgDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJjb21leF9zZXNjby54bHN4IikNCg0KI0V4cG8gZ2FzIFNFU0NPIGNhbnRpZGFkZXMNCmV4cG9fc2VzY29fcV9nYXMgPC0gY29tZXhfZ2FzICAlPiUNCiAgZmlsdGVyKHZhcmlhYmxlID09ICJleHBvcnRhY2lvbiIsDQogICAgICAgICB1bmlkYWQgPT0gIm0zIikgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoLWModmFyaWFibGUsIHByb2R1Y3RvKSkgJT4lDQogIHJlbmFtZShleHBvX3Nlc2NvX2dhcyA9IHZhbG9yKSAlPiUNCiAgbXV0YXRlKGV4cG9fc2VzY29fZ2FzID0gcmVwbGFjZV9uYShleHBvX3Nlc2NvX2dhcywgMCApLA0KICAgICAgICAgZXhwb19zZXNjb19nYXMgPSBleHBvX3Nlc2NvX2dhcyAvIDEwMDAsDQogICAgICAgICB1bmlkYWQgPSAiTWlsZXMgZGUgbTMiKQ0KDQojZXhwbyBzZXNjbyBnYXMgdmFsb3INCmV4cG9fc2VzY29fdXNkX2dhcyA8LSBjb21leF9nYXMgICU+JQ0KICBmaWx0ZXIodmFyaWFibGUgPT0gImV4cG9ydGFjaW9uIiwNCiAgICAgICAgIHVuaWRhZCA9PSAiVVNEIikgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoLWModmFyaWFibGUsIHByb2R1Y3RvKSkgJT4lDQogIHJlbmFtZShleHBvX3Nlc2NvX2dhcyA9IHZhbG9yKSAlPiUNCiAgbXV0YXRlKGV4cG9fc2VzY29fZ2FzID0gcmVwbGFjZV9uYShleHBvX3Nlc2NvX2dhcywgMCApKQ0KDQoNCiNleHBvIFVOIENvbXRyYWRlDQpleHBvX2dhc19zaXRjIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9VTiBDb210cmFkZS9yZXN1bHRhZG9zL2V4cG9fZ2FzX3NpdGMuY3N2IikgICU+JSANCiAgcmVuYW1lKHRyYWRlX3ZhbHVlX3VzZCA9ICJUcmFkZSBWYWx1ZSAoVVMkKSIpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJVU0QiLA0KICAgICAgICAgZXhwb19NbTMgPSBleHBvX01tMyAvMTAwMCwNCiAgICAgICAgIHVuaWRhZF9jYW50aWRhZCA9ICAiTWlsZXMgZGUgbTMiKQ0KDQoNCiNNZXJnZSBjYW50aWRhZGVzDQpleHBvX3FfZ2FzIDwtICBleHBvX3Nlc2NvX3FfZ2FzICU+JSANCiAgbGVmdF9qb2luKGNvbWV4X2hpZHJvY2FyYnVyb3NfbWVjb24gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZXhwb19nYXNfbWVjb24gPSBleHBvX01NbTNfZ2FzKSAlPiUNCiAgICAgICAgICAgICAgbXV0YXRlKHVuaWRhZCA9ICJNaWxlcyBkZSBtMyIsDQogICAgICAgICAgICAgICAgICAgICBleHBvX2dhc19tZWNvbiA9IGV4cG9fZ2FzX21lY29uICogMTAwMCkgKSAlPiUgDQogIGxlZnRfam9pbihjYW50aWRhZGVzX2V4cG9faGlkcm9faW5kZWMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoLWV4cG9faW5kZWNfY3J1ZG8pKSAlPiUgDQogIGZ1bGxfam9pbihleHBvX2dhc19zaXRjICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZXhwb19nYXNfY29tdHJhZGUgPSBleHBvX01tMywgdW5pZGFkID0gdW5pZGFkX2NhbnRpZGFkICkpICU+JSANCiAgIyBtdXRhdGUoZGlmID0gZXhwb19zZXNjb19nYXMvIGV4cG9faW5kZWNfZ2FzIC0gMSApICU+JQ0KICBtdXRhdGUoZXhwb19nYXMgPSBjYXNlX3doZW4oYW5pbyA8IDE5OTcgfiBleHBvX2dhc19jb210cmFkZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+IDE5OTYgfmV4cG9fc2VzY29fZ2FzICkpICU+JSANCiAgYXJyYW5nZShhbmlvKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV4cG9fZ2FzLCBldmVyeXRoaW5nKC4pKQ0KDQpleHBvX3FfZ2FzX01NQlRVIDwtIGV4cG9fcV9nYXMgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHNlbGVjdCgtYyh1bmlkYWQpKSAlPiUgDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkge2NvbnZlcnNvcl9tM01NQlRVX3EoeCoxMDAwKX0gKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiTU1CVFUiKQ0KDQojTWVyZ2UgdmFsb3INCmV4cG9fdXNkX2dhcyA8LSBleHBvX3Nlc2NvX3VzZF9nYXMgJT4lDQogIGxlZnRfam9pbihjb21leF9oaWRyb2NhcmJ1cm9zX21lY29uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGV4cG9fZ2FzX21lY29uID0gZXhwb19nYXNfTU11c2QpICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGV4cG9fZ2FzX21lY29uID0gZXhwb19nYXNfbWVjb24gKiAxMDAwMDAwKSkgICU+JSANCiAgbGVmdF9qb2luKGV4cG9faGlkcm9fdmFsb3JfaW5kZWMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZXhwb19nYXNfaW5kZWMgPSBleHBvX2luZGVjX2dhcykpICU+JSANCiAgZnVsbF9qb2luKGV4cG9fZ2FzX3NpdGMgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBleHBvX2dhc19jb210cmFkZSA9IHRyYWRlX3ZhbHVlX3VzZCwgdW5pZGFkICkpICU+JSANCiAgIyBtdXRhdGUoZGlmID0gZXhwb19zZXNjb19nYXMvZXhwb19nYXNfaW5kZWMgLTEpICU+JSANCiAgbXV0YXRlKGV4cG9fZ2FzID0gY2FzZV93aGVuKGFuaW8gPCAxOTk3IH4gZXhwb19nYXNfY29tdHJhZGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPj0gMTk5NyB+IGV4cG9fc2VzY29fZ2FzKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBleHBvX2dhcywgZXZlcnl0aGluZyguKSkgJT4lIA0KICBhcnJhbmdlKGFuaW8pDQogIA0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdCggY2FudGlkYWRlcyA9IGV4cG9fcV9nYXMsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRCA9IGV4cG9fdXNkX2dhcywgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2V4cG9feV9yZWZlcmVuY2lhID0gcHJlY2lvX2V4cG9feV9tZV9nYXMpLA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9leHBvX2dhcy54bHN4IikNCg0KIyBjb21leF9jcnVkb19zZXNjbyAlPiUgZmlsdGVyKHVuaWRhZCA9PSAibTMiLCB2YXJpYWJsZSA9PSAiZXhwb3J0YWNpb24iKQ0KIyBjb21leF9nYXMgJT4lIGZpbHRlcih1bmlkYWQgPT0gIm0zIiwgdmFyaWFibGUgPT0gImV4cG9ydGFjaW9uIikNCmV4cG9fcV9nYXMgDQpleHBvX3VzZF9nYXMNCmBgYA0KDQojIyBFbXBsZW8sIFJlbXVuZXJhY2lvbmVzIHkgTWFzYSBTYWxhcmlhbCAoQ0NOTikNCg0KKiBTYWxhcmlvIHkgZW1wbGVvDQogICsgTVRFeVNTIChCYXNlIE1pbmVyw61hIGUgSGlkcm9jYXJidXJvcyBkZSBsYXMgQ3VlbnRhcyBOYWNpb25hbGVzKSAoMTk5Ni0yMDEzKQ0KICArIFtNaW5pc3RlcmlvIGRlIFRyYWJham8sIEVtcGxlbyB5IFNlZ3VyaWRhZCBTb2NpYWwgLSBPYnNlcnZhdG9yaW8gZGUgRW1wbGVvIHkgRGluw6FtaWNhIEVtcHJlc2FyaWFsIChPRURFKV0oaHR0cDovL3d3dy50cmFiYWpvLmdvYi5hci9lc3RhZGlzdGljYXMvb2VkZS9lc3RhZGlzdGljYXNuYWNpb25hbGVzLmFzcCkgKDE5OTYtMjAxOSkNCiAgKyBFUEggPz8NCjxicj4NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNhbnVhcmlvcyBDRVBBTA0KY2VwYWxfMTk5MSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0NFUEFML2NlcGFsXzE5OTEueGxzeCIpICU+JSANCiAgbXV0YXRlKHZhbG9yID0gdmFsb3IgLyBjb252ZXJzb3JfcGVzb3MkQSAvMTBeMywNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyBjb3JyaWVudGVzIikNCg0KbWFzYV9zYWxhcmlhbF9jZXBhbCA8LSBjZXBhbF8xOTkxICU+JSANCiAgZmlsdGVyKHZhcmlhYmxlID09ICJyZW11bmVyYWNpb25fYWxfdHJhYmFqbyIpICU+JSANCiAgcmVuYW1lKG1zX2NlcGFsID0gdmFsb3IpDQogIA0KDQojY29uIGRhdG9zIGRlIGxhIGJhc2UgZGUgQ0NOTg0KZW1wbGVvIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvTWVjb24vYmFzZS1taW5lcmlhLWUtaGlkcm9jYXJidXJvcyBjdWVudGFzIG5hY2lvbmFsZXMueGxzIiwgDQogICAgc2hlZXQgPSAiRW1wbGVvIHJlZ2lzdHJhZG8iLCBza2lwID0gNSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw7FvIiwNCiAgICAgICAgICBwZXJpb2RvID0iUGVyw61vZG8iLA0KICAgICAgICAgZW1wbGVvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyA9ICIuLi43IiwNCiAgICAgICAgZW1wbGVvX3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zID0gIi4uLjgiICkgJT4lDQogICBmaWx0ZXIoaXMubmEocGVyaW9kbyksICFpcy5uYShhbmlvKSApICU+JQ0KICBzZWxlY3QoYW5pbywgZW1wbGVvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyxlbXBsZW9fc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgKSAlPiUgDQogIG11dGF0ZSh1bmlkYWRfZW1wbGVvID0gIlB1ZXN0b3MgZGUgdHJhYmFqbyIsDQogICAgICAgICBlbXBsZW9fZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zID0gYXMuZG91YmxlKGVtcGxlb19leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MpLA0KICAgICAgICAgZW1wbGVvX3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zID0gYXMuZG91YmxlKGVtcGxlb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcykpIA0KICANCg0Kc2FsYXJpb3MgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NZWNvbi9iYXNlLW1pbmVyaWEtZS1oaWRyb2NhcmJ1cm9zIGN1ZW50YXMgbmFjaW9uYWxlcy54bHMiLCANCiAgICBzaGVldCA9ICJSZW11bmVyYWNpb25lcyIsIGNvbF90eXBlcyA9IGMoIm51bWVyaWMiLCANCiAgICAgICAgImRhdGUiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsIA0KICAgICAgICAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICJ0ZXh0IiksIHNraXAgPSA1KSAlPiUgDQogICAgcmVuYW1lKGFuaW8gPSAiQcOxbyIsDQogICAgICAgICAgcGVyaW9kbyA9IlBlcsOtb2RvIiwNCiAgICAgICAgICBzYWxhcmlvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyA9ICIuLi43IiwNCiAgICAgICAgIHNhbGFyaW9fc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgPSAgIi4uLjgiKSAlPiUgDQogIGZpbHRlcighaXMubmEoYW5pbykgJiBhbmlvIDwgMjAxNCkgJT4lIA0KICBzZWxlY3QoYW5pbywgc2FsYXJpb19leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3Msc2FsYXJpb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyApICU+JSANCiAgbXV0YXRlKHVuaWRhZF9zYWxhcmlvID0gIlBlc29zIGNvcnJpZW50ZXMiLA0KICAgICAgICAgc2FsYXJpb19leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3M9IGFzLmRvdWJsZShzYWxhcmlvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyksDQogICAgICAgIHNhbGFyaW9fc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgPSBhcy5kb3VibGUoc2FsYXJpb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcykpDQogICANCm1hc2Ffc2FsYXJpYWxfY2NubiA8LSBlbXBsZW8gJT4lIA0KICBsZWZ0X2pvaW4oc2FsYXJpb3MsIGJ5ID0gImFuaW8iKSAlPiUgDQogIG11dGF0ZSh1bmlkYWRfbWFzYV9zYWxhcmlhbCA9ICJNaWxsb25lcyBkZSBwZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgIG1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbiA9IChzYWxhcmlvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyAqZW1wbGVvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyoxMykvMTBeNiwNCiAgICAgICAgIG1hc2Ffc2FsYXJpYWxfc2VydmljaW9zID0gKHNhbGFyaW9fc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgKmVtcGxlb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyoxMykvMTBeNiwNCiAgICAgICAgIG1hc2Ffc2FsYXJpYWxfdG90YWwgPSBtYXNhX3NhbGFyaWFsX2V4dHJhY2Npb24gKyBtYXNhX3NhbGFyaWFsX3NlcnZpY2lvcykgDQoNCg0KDQojY29uIGRhdG9zIGRlIGVtcGxlbyByZWdpc3RyYWRvIA0KcmVtdW5lcmFjaW9uZXNfYW51YWwgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NaW5pc3RlcmlvIFRyYWJham8vbmFjaW9uYWxfc2VyaWVfcmVtdW5lcmFjaW9uZXNfYW51YWwueGxzeCIsIA0KICAgIHNoZWV0ID0gIkMgNSIsIGNvbF90eXBlcyA9IGMoInNraXAiLCANCiAgICAgICAgInRleHQiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiksIHNraXAgPSA0KSAlPiUgDQogIGdhdGhlcihrZXkgPSBhbmlvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDI6bmNvbCguKSkgJT4lDQogIHJlbmFtZShyYW1hX2FjdGl2aWRhZCA9ICJSYW1hIGRlIGFjdGl2aWRhZCIpICU+JSANCiAgZmlsdGVyKCBzdHJfZGV0ZWN0KHJhbWFfYWN0aXZpZGFkLCAicGV0csOzbGVvIikpICU+JSANCiAgbXV0YXRlKHVuaWRhZF9zYWxhcmlvID0gIlBlc29zIGNvcnJpZW50ZXMiLA0KICAgICAgICAgcmFtYV9hY3RpdmlkYWQ9IA0KICAgICAgICAgICBjYXNlX3doZW4ocmFtYV9hY3RpdmlkYWQ9PQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY3RpdmlkYWRlcyAgZGUgc2VydmljaW9zIHJlbGFjaW9uYWRhcyBjb24gbGEgZXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIHkgZ2FzLCBleGNlcHRvIGxhcyBhY3RpdmlkYWRlcyBkZSBwcm9zcGVjY2nDs24iIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbXVuZXJhY2lvbl9zZXJ2aWNpb3NfZXh0cmFjY2lvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbWFfYWN0aXZpZGFkPT0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIGNydWRvIHkgZ2FzIG5hdHVyYWwiIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbXVuZXJhY2lvbl9leHRyYWNjaW9uX3BldHJvbGVvX2dhcyIpKSAlPiUgDQogICAgZmlsdGVyKCEoaXMubmEocmFtYV9hY3RpdmlkYWQpKSkgJT4lIA0KICBzcHJlYWQoa2V5ID0gcmFtYV9hY3RpdmlkYWQsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yKQ0KICANCg0KDQplbXBsZW9fYW51YWwgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NaW5pc3RlcmlvIFRyYWJham8vbmFjaW9uYWxfc2VyaWVfZW1wbGVvX2FudWFsLnhsc3giLCANCiAgICBzaGVldCA9ICJDIDUiLCBjb2xfdHlwZXMgPSBjKCJza2lwIiwgDQogICAgICAgICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCANCiAgICAgICAgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsIA0KICAgICAgICAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCANCiAgICAgICAgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIpLCANCiAgICBza2lwID0gNCklPiUgDQogIGdhdGhlcihrZXkgPSBhbmlvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDI6bmNvbCguKSkgJT4lDQogIHJlbmFtZShyYW1hX2FjdGl2aWRhZCA9ICJSYW1hIGRlIGFjdGl2aWRhZCIpICU+JSANCiAgZmlsdGVyKCBzdHJfZGV0ZWN0KHJhbWFfYWN0aXZpZGFkLCAicGV0csOzbGVvIikpICU+JSANCiAgbXV0YXRlKHZhbG9yID0gYXMuZG91YmxlKHZhbG9yKSwNCiAgICAgICAgIHVuaWRhZF9lbXBsZW8gPSAiUHVlc3RvcyBkZSB0cmFiYWpvIiwNCiAgICAgICAgIHJhbWFfYWN0aXZpZGFkPSBjYXNlX3doZW4ocmFtYV9hY3RpdmlkYWQ9PQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY3RpdmlkYWRlcyAgZGUgc2VydmljaW9zIHJlbGFjaW9uYWRhcyBjb24gbGEgZXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIHkgZ2FzLCBleGNlcHRvIGxhcyBhY3RpdmlkYWRlcyBkZSBwcm9zcGVjY2nDs24iIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVtcGxlb19zZXJ2aWNpb3NfZXh0cmFjY2lvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbWFfYWN0aXZpZGFkPT0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIGNydWRvIHkgZ2FzIG5hdHVyYWwiIH4gImVtcGxlb19leHRyYWNjaW9uX3BldHJvbGVvX2dhcyIpKSAlPiUgDQogIGZpbHRlcighKGlzLm5hKHJhbWFfYWN0aXZpZGFkKSkpICU+JSANCiAgc3ByZWFkKGtleSA9IHJhbWFfYWN0aXZpZGFkLA0KICAgICAgICAgdmFsdWUgPSB2YWxvcikNCg0KbWFzYV9zYWxhcmlhbF9vZWRlIDwtIGVtcGxlb19hbnVhbCAlPiUgDQogIGxlZnRfam9pbihyZW11bmVyYWNpb25lc19hbnVhbCwgYnkgPSAiYW5pbyIpICU+JSANCiAgbXV0YXRlKHVuaWRhZF9tYXNhX3NhbGFyaWFsID0gIk1pbGxvbmVzIGRlIHBlc29zIGNvcnJpZW50ZXMiLA0KICAgICAgICAgbWFzYV9zYWxhcmlhbF9leHRyYWNjaW9uID0gKCAgcmVtdW5lcmFjaW9uX2V4dHJhY2Npb25fcGV0cm9sZW9fZ2FzICplbXBsZW9fZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMqMTMpLzEwXjYsDQogICAgICAgICBtYXNhX3NhbGFyaWFsX3NlcnZpY2lvcyA9IChyZW11bmVyYWNpb25fc2VydmljaW9zX2V4dHJhY2Npb24gKmVtcGxlb19zZXJ2aWNpb3NfZXh0cmFjY2lvbioxMykvMTBeNiwNCiAgICAgICAgIG1hc2Ffc2FsYXJpYWxfdG90YWwgPSBtYXNhX3NhbGFyaWFsX3NlcnZpY2lvcyArIG1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbiwNCiAgICAgICAgIGFuaW8gPWFzLmRvdWJsZShhbmlvKSkNCg0KbWFzYV9zYWxhcmlhbF9oaWRyb2NhcmJ1cm9zIDwtIG1hc2Ffc2FsYXJpYWxfY2NubiAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQgPSB1bmlkYWRfbWFzYV9zYWxhcmlhbCwgbWFzYV9zYWxhcmlhbF9leHRyYWNjaW9uX2Njbm49IG1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbiwgDQogICAgICAgICBtYXNhX3NhbGFyaWFsX3RvdGFsX2Njbm4gPSBtYXNhX3NhbGFyaWFsX3RvdGFsKSAlPiUgDQogIGZ1bGxfam9pbihtYXNhX3NhbGFyaWFsX29lZGUgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX21hc2Ffc2FsYXJpYWwsIA0KICAgICAgICAgICAgICAgICAgICAgbWFzYV9zYWxhcmlhbF9leHRyYWNjaW9uX29lZGU9IG1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbiwNCiAgICAgICAgICAgICAgICAgICAgIG1hc2Ffc2FsYXJpYWxfdG90YWxfb2VkZSA9bWFzYV9zYWxhcmlhbF90b3RhbCkpICU+JSANCiAgZnVsbF9qb2luKG1hc2Ffc2FsYXJpYWxfY2VwYWwgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLCBtc19jZXBhbCkpICU+JSANCiAgIyBtdXRhdGUobXMgPSBjYXNlX3doZW4oYW5pbyA8IDE5OTYgfiBtc19jZXBhbCwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+PSAxOTk2IH5tYXNhX3NhbGFyaWFsX29lZGUpKSAlPiUgDQogIGFycmFuZ2UoYW5pbykNCm1hc2Ffc2FsYXJpYWxfaGlkcm9jYXJidXJvcyAgDQoNCg0KYGBgDQoNCg0KDQojIyBQb3pvcw0KDQoNCiMjIyBNZXRyb3MgcGVyZm9yYWRvcw0KDQpGdWVudGU6DQoNCiogW1NlY3JldGFyw61hIGRlIEVuZXJnw61hXShodHRwczovL2RhdG9zLmdvYi5hci9kYXRhc2V0L2VuZXJnaWEtcGVyZm9yYWNpb24tcG96b3MtcGV0cm9sZW8tZ2FzKQ0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQptZXRyb3NfcGVyZm9yYWRvc19wb3N0ZXJpb3JfYWxfMjAwOSA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9zZWNyZXRhcmlhIGRlIGVuZXJnaWEvbWV0cm9zLXBlcmZvcmFkb3MuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhpbmRpY2VfdGllbXBvID0gY29sX2RhdGUoZm9ybWF0ID0gIiVZLSVtIikpKQ0KDQptZXRyb3NfcGVyZm9yYWRvc19hbnRlcmlvcl9hbF8yMDA5IDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL3NlY3JldGFyaWEgZGUgZW5lcmdpYS9tZXRyb3MtcGVyZm9yYWRvcy1hbnRlcmlvci1hbC0yMDA5LmNzdiIpICU+JSANCiAgcmVuYW1lKGNhbnRpZGFkID0gQ2FudGlkYWQpDQoNCm1ldHJvc19wZXJmb3JhZG9zX2VtcHJlc2EgPC0gbWV0cm9zX3BlcmZvcmFkb3NfcG9zdGVyaW9yX2FsXzIwMDkgJT4lDQogIGJpbmRfcm93cyhtZXRyb3NfcGVyZm9yYWRvc19hbnRlcmlvcl9hbF8yMDA5KSAlPiUgDQogIHNlbGVjdChhbmlvLCBtZXMsIGlkZW1wcmVzYSwgZW1wcmVzYSwgaWRjb25jZXB0bywgY29uY2VwdG8sIGNhbnRpZGFkLCBvYnNlcnZhY2lvbmVzICkgJT4lIA0KICBncm91cF9ieShhbmlvLCBpZGVtcHJlc2EsIGVtcHJlc2EpICU+JQ0KICBzdW1tYXJpc2UobWV0cm9zX3BlcmZvcmFkb3MgPSBzdW0oY2FudGlkYWQsIG5hLnJtID0gVCkpICU+JSANCiAgdW5ncm91cCgpDQogIA0KDQptZXRyb3NfcGVyZm9yYWRvcyA8LSBtZXRyb3NfcGVyZm9yYWRvc19lbXByZXNhICU+JQ0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShtZXRyb3NfcGVyZm9yYWRvcyA9IHN1bShtZXRyb3NfcGVyZm9yYWRvcywgbmEucm0gPSBUKSkgJT4lDQogIG11dGF0ZShpbmRpY2VfbWV0cm9zID0gZ2VuZXJhcl9pbmRpY2Uoc2VyaWU9IG1ldHJvc19wZXJmb3JhZG9zLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYSA9IGFuaW8sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhX2Jhc2UgPSAyMDAxKSkgDQoNCmdyYWZfbWV0cm9zX3BlcmZvcmFkb3MgPC0gbWV0cm9zX3BlcmZvcmFkb3NfZW1wcmVzYSU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCBtZXRyb3NfcGVyZm9yYWRvcywgZmlsbCA9IGVtcHJlc2EpKSArDQogIGdlb21fY29sKCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpKw0KICBsYWJzKHRpdGxlID0gIk1ldHJvcyBwZXJmb3JhZG9zIHBvciBlbXByZXNhIikrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9ZnVuY3Rpb24oeCkgZm9ybWF0KHgsIGJpZy5tYXJrID0gIi4iLCBzY2llbnRpZmljID0gRkFMU0UpKQ0KZ2dwbG90bHkoZ3JhZl9tZXRyb3NfcGVyZm9yYWRvcywgd2lkdGggPSA4MDAsIGhlaWdodCA9IDYwMCkNCg0KDQojbGlzdGFkbyBkZSBlbXByZXNhcyBjb24gc3VzIGlkJ3MNCmxpc3RhZG9fZW1wcmVzYSA8LSBkaXN0aW5jdChtZXRyb3NfcGVyZm9yYWRvc19lbXByZXNhICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGlkZW1wcmVzYSwgZW1wcmVzYSksaWRlbXByZXNhLCAua2VlcF9hbGwgPSBUKSANCiAgDQoNCg0KYGBgDQoNCg0KDQojIyMgUG96b3MgZW4gb3BlcmFjacOzbg0KDQpGdWVudGVzOg0KDQoqIFNlY3JldGFyw61hIGRlIEVuZXJnw61hIC0gW0RhdG9zIE1JTkVNXShodHRwczovL2dpdGh1Yi5jb20vZGF0b3NtaW5lbS9wcm9kdWNjaW9uLWRlLXBldHJvbGVvLXktZ2FzLXBvci1wb3pvKToNCiAgKyBbTGlzdGFkbyBkZSBwb3pvcyBjYXJnYWRvcyBwb3IgZW1wcmVzYXMgb3BlcmFkb3Jhc10oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L3Byb2R1Y2Npb24tZGUtcGV0cm9sZW8teS1nYXMtcG9yLXBvem8vYXJjaGl2by9jYmZhNGQ3OS1mZmIzLTQwOTYtYmFiNS1lYjBkZGU5YTgzODUpOiBzZSB0b21hIGxhIHZhcmlhYmxlICJGZWNoYSBkZWwgRmluIGRlIHRlcm1pbmFjacOzbiBkZSBwZXJmb3JhY2nDs24gZGVsIHBvem8iIChhZGppdl9mZWNoYV9maW5fdGVybSkgY29tbyBhw7FvIGRlIHB1ZXN0YSBlbiBwcm9kdWNjacOzbiBkZWwgcG96by4gU2UgcG9kcsOtYSBlbGFib3JhciB1biBzdG9jayBkZSBwb3pvcyBhIHBhcnRpciBkZSBhY3VtdWxhciBsb3MgcG96b3MgdGVybWluYWRvcyB5IHJlc3RhbmRvIGxvcyBwb3pvcyBhYmFuZG9uYWRvcywgYWdydXBhbmRvIGNvbiBsYSB2YXJpYWJsZSAiRmVjaGEgZGUgYWJhbmRvbm8gZGVsIHBvem8iKGFkaml2X2ZlY2hhX2FiYW5kb25vKQ0KICArIFtQb3pvcyB0ZXJtaW5hZG9zXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvcGVyZm9yYWNpb24tZGUtcG96b3MtZGUtcGV0cm9sZW8teS1nYXMvYXJjaGl2by9hMmNlMTRhZi01YzU2LTQ1YzItOWI5Yy1jN2ExZTUxNTZkZmYpDQogICsgW0NhcMOtdHVsbyBJVl0oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L3Byb2R1Y2Npb24tZGUtcGV0cm9sZW8teS1nYXMtcG9yLXBvem8vYXJjaGl2by9jYjVjMGYwNC03ODM1LTQ1Y2QtYjk4Mi0zZTI1Y2E3ZDc3NTEpDQogICsgW0VzdGFkbyBkZSBwb3pvc10oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L2VzdGFkby1kZS1wb3pvcy1kZS1wZXRyb2xlby15LWdhcykgKEFVTiBOTyBTRSBQUk9DRVPDkyBFU1RBIEJBU0UgTkkgTEEgQU5URVJJT1IpIA0KICArIFtTRVNDT10oaHR0cDovL3d3dy5lbmVyZ2lhLmdvYi5hci9jb250ZW5pZG9zL3ZlcnBhZ2luYS5waHA/aWRwYWdpbmE9MTYyNCkNCiogW0lBUEddKGh0dHBzOi8vd3d3LmlhcGcub3JnLmFyL3dlYl9pYXBnL3NlY3RvcmVzL2VzdGFkaXN0aWNhcy9wcm9kdWN0b3MvbGlzdGFkb3MvbGlzdGFkb190b2Rvc19sb3NfcHJvZHVjdG9zLmh0bSkuIFNlIHByZXNlbnRhbiBkb3Mgc2VyaWVzOiB1bmEgZWxhYm9yYWRhIGEgcGFydGlyIGRlIGxvcyBwb3pvcyBwZXJmb3JhZG9zIHBvciBhw7FvIChyZXN1bHRhbnRlIGRlIGRlc2NhcmdhciB1bmEgYmFzZSBwb3IgY2FkYSBhw7FvIGRlbCBzaXRpbyB3ZWIgb2ZpY2lhbCkgeSBvdHJhIHF1ZSBjb3JyZXNwb25kZSBhbCBzdG9jayBkZSBwb3pvcyBkZSBwZXRyw7NsZW8gZGUgZXh0cmFjY2nDs24gZWZlY3RpdmEgKHByb2NlZGVudGUgZGUgbG9zIGRhdG9zIGRlIEVzdGFkw61zdGljYXMgZGVsIENlbnRlbmFyaW8gZGUgSUFQRykuDQoNCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFLCBtZWNobz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9DQojIHNlYyBlbmVyZ2lhDQojIHBvem9zIGNhcmdhZG9zIHBvciBlbXByZXNhcw0KbGlzdGFkb19wb3pvcyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9jYXBpdHVsbyBpdi9saXN0YWRvLWRlLXBvem9zLWNhcmdhZG9zLXBvci1lbXByZXNhcy1vcGVyYWRvcmFzLmNzdiIpICU+JSANCiAgbXV0YXRlKGFuaW9fdGVybWluYWNpb25fcG96byA9eWVhcihhZGppdl9mZWNoYV9maW5fdGVybSkpICU+JQ0KICBsZWZ0X2pvaW4obGlzdGFkb19lbXByZXNhKSAlPiUgDQogIGdyb3VwX2J5KGFuaW9fdGVybWluYWNpb25fcG96bywgaWRlbXByZXNhLCBlbXByZXNhKSAlPiUgDQogIHN1bW1hcmlzZShwb3pvcyA9IG4oKSkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGFuaW9fdGVybWluYWNpb25fcG96bykpDQoNCg0KICAjIG11dGF0ZShlbXByZXNhID0gY2FzZV93aGVuKGlkZW1wcmVzYSA9PSAiWVBGIiB+ICJZUEYiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJQQUUiIH4gIlBBRSIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIllTVVIiIH4gIllTVVIiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJQTFUiIH4gIlBsdXNwZXRyb2wiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJQTFVFIiB+ICJQbHVzcGV0cm9sIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wcmVzYSA9PSAiVklTIiB+ICJWaXN0YSBPaWwgYW5kIEdhcyIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIlRQVCIgfiAiVGVjcGV0cm9sIiwgDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIkNHQyIgfiAiQ0dDIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wcmVzYSA9PSAiV0lOIiB+ICJXaW50ZXJzaGFsbCIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIlRBVSIgfiAiVG90YWwgQXVzdHJhbCIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIllTVVIiIH4gIllTVVIiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJTSEUiIH4gIlNoZWxsIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wcmVzYSA9PSAiQ0FQIiB+ICJDYXBleCIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIlBQQU0iIH4gIlBhbXBhIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiAiT3RyYSIpKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlkZW1wcmVzYSA9PSAiUEVUUk9CUkFTIEFSR0VOVElOQSBTLkEuIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWRlbXByZXNhID09ICJQRVNBIChQRVRST0JSQVMgRS5TLkEuKSIgfiAiUGV0cm9icmFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlkZW1wcmVzYSA9PSAiRU5BUCBTSVBFVFJPTCBBUkdFTlRJTkEgUy5BLiIgfiAiRU5BUCBTSVBFVFJPTCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZGVtcHJlc2EgPT0gIlZJU1RBIE9JTCAmIEdBUyBBUkdFTlRJTkEgU0EiIH4gIlZpc3RhIE9pbCBhbmQgR2FzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlkZW1wcmVzYSA9PSAiU0lOT1BFQyBBUkdFTlRJTkEgRVhQTE9SQVRJT04gQU5EIFBST0RVQ1RJT04sIElOQy4iIH4gIlNpbm9wZWMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWRlbXByZXNhID09ICJQTFVTUEVUUk9MIEVORVJHWSBTLkEuIiB+ICJQbHVzcGV0cm9sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlkZW1wcmVzYSA9PSAiWVNVUiBQRVRST0xFUkEgQVJHRU5USU5BIFMuQS4iIH4gIllTVVIiKSkNCg0KZ3JhZl9wb3pvc19zZWNfZW5lcmdpYSA8LSBsaXN0YWRvX3Bvem9zICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvX3Rlcm1pbmFjaW9uX3Bvem8sIHBvem9zLCBmaWxsID0gZW1wcmVzYSkpKw0KICBnZW9tX2NvbCgpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsNCiAgbGFicyh0aXRsZSA9ICJQb3pvcyBjYXJnYWRvcyBwb3IgZW1wcmVzYXMgb3BlcmFkb3JhcyAocG9yIGHDsW8gZGUgdGVybWluYWNpw7NuKSIsDQogICAgICAgY2FwdGlvbiA9ICJTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSIpDQpnZ3Bsb3RseShncmFmX3Bvem9zX3NlY19lbmVyZ2lhLCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiAgDQpwb3pvc190ZXJtaW5hZG9zX2FudGVyaW9yX2FsXzIwMDkgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3Mvc2VjcmV0YXJpYSBkZSBlbmVyZ2lhL3Bvem9zLXRlcm1pbmFkb3MtYW50ZXJpb3ItYWwtMjAwOS5jc3YiKSAlPiUgDQogIHJlbmFtZShjYW50aWRhZCA9IENhbnRpZGFkKQ0KDQpwb3pvc190ZXJtaW5hZG9zIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL3NlY3JldGFyaWEgZGUgZW5lcmdpYS9wb3pvcy10ZXJtaW5hZG9zLmNzdiIpICU+JSANCiAgYmluZF9yb3dzKHBvem9zX3Rlcm1pbmFkb3NfYW50ZXJpb3JfYWxfMjAwOSkgJT4lIA0KICBncm91cF9ieShhbmlvLCBpZGVtcHJlc2EsIGVtcHJlc2EgKSAlPiUgDQogIHN1bW1hcmlzZShwb3pvcyAgPSBzdW0oY2FudGlkYWQsIG5hLnJtID0gVCkpDQoNCg0KZ3JhZl9wb3pvc190ZXJtaW5hZG9zIDwtIHBvem9zX3Rlcm1pbmFkb3MgJT4lDQogIGdncGxvdChhZXMoYW5pbywgcG96b3MgLCBmaWxsID0gZW1wcmVzYSkpKw0KICBnZW9tX2NvbCgpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsNCiAgbGFicyh0aXRsZSA9ICJDYW50aWRhZCBkZSBwb3pvcyB0ZXJtaW5hZG9zIiwNCiAgICAgICBjYXB0aW9uID0gIlNlY3JldGFyw61hIGRlIEVuZXJnw61hIikNCmdncGxvdGx5KGdyYWZfcG96b3NfdGVybWluYWRvcywgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojcG96b3MgaWFwZyAoYmFzZXMgYW51YWxlcykNCnBvem9faWFwZ18wNSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMDUueGxzIiwgDQogICAgc2tpcCA9IDEpICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDA1KSAlPiUgDQogIGdyb3VwX2J5KE9wZXJhZG9yKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpwb3pvX2lhcGdfMDYgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDA2LnhscyIsIA0KICAgIHNraXAgPSAxKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAwNikgJT4lIA0KICBncm91cF9ieShPcGVyYWRvcikgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0KcG96b19pYXBnXzA3IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAwNy54bHMiLCANCiAgICBza2lwID0gMSkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMDcpICU+JSANCiAgZ3JvdXBfYnkoT3BlcmFkb3IpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpDQoNCnBvem9faWFwZ18wOCA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMDgueGxzIiwgDQogICAgc2tpcCA9IDIpICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDA4KSAlPiUgDQogIGdyb3VwX2J5KE9wZXJhZG9yKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpwb3pvX2lhcGdfMDkgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDA5LnhscyIsIA0KICAgIHNraXAgPSAyKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAwOSkgJT4lIA0KICBncm91cF9ieShPcGVyYWRvcikgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0KcG96b19pYXBnXzEwIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAxMC54bHMiLCANCiAgICBza2lwID0gMikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMTApICU+JSANCiAgZ3JvdXBfYnkoT3BlcmFkb3IpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpDQoNCnBvem9faWFwZ18xMiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMTIueGxzIiwgDQogICAgc2tpcCA9IDIpICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDEyKSAlPiUgDQogIGdyb3VwX2J5KE9wZXJhZG9yKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpwb3pvX2lhcGdfMTMgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDEzLnhscyIsIA0KICAgIHNraXAgPSAyKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAxMykgJT4lIA0KICBncm91cF9ieShPcGVyYWRvcikgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0KcG96b19pYXBnXzE0IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAxNC54bHMiLCANCiAgICBza2lwID0gMikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMTQpICU+JSANCiAgZ3JvdXBfYnkoT3BlcmFkb3IpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpDQoNCnBvem9faWFwZ18xNSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMTUueGxzIiwgDQogICAgc2tpcCA9IDIpICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDE1KSAlPiUgDQogIGdyb3VwX2J5KE9wZXJhZG9yKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpwb3pvX2lhcGdfMTYgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDE2LnhscyIsIA0KICAgIHNraXAgPSAyKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAxNikNCg0KcG96b19pYXBnXzE3IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAxNy54bHMiLCANCiAgICBza2lwID0gMikgICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDE3KQ0KDQpwb3pvX2lhcGdfMTggPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDE4LnhscyIsIA0KICAgIHNraXAgPSAyKSAgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMTgpDQoNCnBvem9faWFwZ18xOSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMTkueGxzIiwgDQogICAgc2tpcCA9IDIpICAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAxOSkgJT4lIA0KICByZW5hbWUoIlRvdGFsIFBvem9zIiA9ICJUb3RhbCBQb3pvcyBUZXJtaW5hZG9zIikNCg0KI3NlIG1lIGNvbGFyb24gYWxndW5hcyBmaWxhcyBkZSB0b3RhbGVzIHF1ZSBoYXkgcXVlIGJvcnJhcg0KcG96b3NfaWFwZyA8LSBwb3pvX2lhcGdfMDUgJT4lIA0KICBiaW5kX3Jvd3MocG96b19pYXBnXzA2LCBwb3pvX2lhcGdfMDcsIHBvem9faWFwZ18wOCwgcG96b19pYXBnXzA5LCANCiAgICAgICAgICAgIHBvem9faWFwZ18xMCwgcG96b19pYXBnXzEyLCBwb3pvX2lhcGdfMTMsIHBvem9faWFwZ18xNCwgcG96b19pYXBnXzE1LA0KICAgICAgICAgICAgcG96b19pYXBnXzE2LCBwb3pvX2lhcGdfMTcsIHBvem9faWFwZ18xOCwgcG96b19pYXBnXzE5KSAlPiUNCiAgcmVuYW1lKHRvdGFsX3Bvem9zID0gICJUb3RhbCBQb3pvcyIpICU+JSANCiAgZmlsdGVyKCEoT3BlcmFkb3IgJWluJSBjKCJUb3RhbGVzIiwgIlRPVEFMIikpICYgIShpcy5uYShPcGVyYWRvcikpICkgJT4lIA0KICBtdXRhdGUoZW1wcmVzYSA9Y2FzZV93aGVuKE9wZXJhZG9yID09ICJZUEYgUy5BLiIgfiAiWVBGIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiUEFOIEFNRVJJQ0FOIEVORVJHWSAoU1VDVVJTQUwgQVJHRU5USU5BKSBMTEMiIH4gIlBBRSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIlBBTiBBTUVSSUNBTiBFTkVSR1kgU0wiIH4gIlBBRSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIlBBTiBBTUVSSUNBTiIgfiAiUEFFIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiUEVUUk9CUkFTIEFSR0VOVElOQSBTLkEuIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJQRVNBIChQRVRST0JSQVMgRS5TLkEuKSIgfiAiUGV0cm9icmFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiVEVDUEVUUk9MIFMuQS4iIH4gIlRlY3BldHJvbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIlBMVVNQRVRST0wgUy5BLiIgfiAiUGx1c3BldHJvbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIlNJTk9QRUMgQVJHRU5USU5BIEVYUExPUkFUSU9OIElOQyIgfiAiU2lub3BlYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIkNPTVBBw5HDjUEgR0VORVJBTCBERSBDT01CVVNUSUJMRVMgUy5BLiIgfiAiQ0dDIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiVklTVEEgT0lMICYgR0FTIEFSR0VOVElOQSBTQSIgfiAiVmlzdGEgT2lsIGFuZCBHYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJWSVNUQSBPSUwgJiBHQVMgQVJHRU5USU5BIFNBVSIgfiAiVmlzdGEgT2lsIGFuZCBHYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJXSU5URVJTSEFMTCBFTkVSR0lBIFMuQS4iIH4gIldpbnRlcnNoYWxsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiRU5BUCBTSVBFVFJPTCBBUkdFTlRJTkEgUy5BLiIgfiAiRU5BUCBTSVBFVFJPTCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIllTVVIgRU5FUkfDjUEgQVJHRU5USU5BIFMuUi5MLiIgfiAiWVNVUiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIllTVVIgUEVUUk9MRVJBIEFSR0VOVElOQSBTLkEiIH4gIllTVVIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJUT1RBTCBBVVNUUkFMIFMuQS4iIH4gIlRvdGFsIEF1c3RyYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBPcGVyYWRvcikpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGVtcHJlc2EpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIHNlbGVjdChlbXByZXNhLCBhbmlvLHRvdGFsX3Bvem9zKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIGVtcHJlc2EpICU+JSANCiAgc3VtbWFyaXNlKHRvdGFsX3Bvem9zID0gc3VtKHRvdGFsX3Bvem9zKSkgJT4lIA0KICBhcnJhbmdlKGFuaW8pDQpwb3pvc19pYXBnDQoNCmdyYWZfcG96b3NfaWFwZyA8LSBwb3pvc19pYXBnICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCB0b3RhbF9wb3pvcywgZmlsbCA9IGVtcHJlc2EpKSsNCiAgZ2VvbV9jb2woKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikrDQogIGxhYnModGl0bGUgPSAiUG96b3MgcGVyZm9yYWRvcyIsDQogICAgICAgY2FwdGlvbiA9ICJJQVBHIikNCmdncGxvdGx5KGdyYWZfcG96b3NfaWFwZywgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCmBgYA0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNwb3pvcyBpYXBnIGFjdW11bGFkb3MNCnBvem9zX2lhcGdfY2VudGVuYXJpbyA8LSByZWFkX2RlbGltKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvcG96b3NfaWFwZ19jZW50ZW5hcmlvLmNzdiIsICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lIA0KICByZW5hbWUodG90YWxlcyA9IHRvdGFsZSkNCg0KZ3JhZl9wb3pvc19pYXBnX2NlbnRlbmFyaW8gPC0gcG96b3NfaWFwZ19jZW50ZW5hcmlvICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCB0b3RhbGVzKSkrDQogIGdlb21fY29sKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICBsYWJzKHRpdGxlID0gIlBvem9zIGVuIGV4dHJhY2Npw7NuIGRlZmluaXRpdmEiLA0KICAgICAgIGNhcHRpb24gPSAiSUFQRyIpDQpnZ3Bsb3RseShncmFmX3Bvem9zX2lhcGdfY2VudGVuYXJpbywgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCg0KDQojIGNvbXBhcmFjaW9uIGRlIGZ1ZW50ZXMNCmNvbXBhcmFjaW9uX3Bvem9zIDwtIHBvem9zX2lhcGcgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShwb3pvc19wZXJmb3JhZG9zX2lhcGcgPSBzdW0odG90YWxfcG96b3MsIG5hLnJtID0gVCkpICU+JSANCiAgcmlnaHRfam9pbihwb3pvc190ZXJtaW5hZG9zICU+JQ0KICAgICAgICAgICAgICAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICAgICAgICAgICAgICAgc3VtbWFyaXNlKHBvem9zX3Rlcm1pbmFkb3Nfc2VjX2VuZXJnaWEgPSBzdW0ocG96b3MsIG5hLnJtID0gVCkpKSAlPiUgDQogIHJpZ2h0X2pvaW4obGlzdGFkb19wb3pvcyAlPiUgDQogICAgICAgICAgICAgICAgcmVuYW1lKGFuaW8gPSBhbmlvX3Rlcm1pbmFjaW9uX3Bvem8pICU+JSANCiAgICAgICAgICAgICAgICBncm91cF9ieShhbmlvKSAlPiUgDQogICAgICAgICAgICAgICAgc3VtbWFyaXNlKHBvem9zX2NhcmdhZG9zX3NlY19lbmVyZ2lhID0gc3VtKHBvem9zLCBuYS5ybSA9IFQpKSkgJT4lIA0KICBmdWxsX2pvaW4ocG96b3NfaWFwZ19jZW50ZW5hcmlvICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKHZhcmlhY2lvbl9wb3pvcyA9IHZhcmlhY2lvbl9pbnRlcmFudWFsKHRvdGFsZXMpKSAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHBvem9zX3ZhcmlhY2lvbl9pYXBnID0gdmFyaWFjaW9uX3Bvem9zKSkgDQoNCg0KZ3JhZl9wb3pvcyA8LSBjb21wYXJhY2lvbl9wb3pvcyAlPiUNCiAgZ2F0aGVyKGtleSA9ICJmdWVudGUiLA0KICAgICAgICAgdmFsdWUgPSAidmFsb3IiLA0KICAgICAgICAgMjpuY29sKC4pKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gZnVlbnRlKSkrDQogIGdlb21fbGluZSgpKw0KICAjIGdlb21fcG9pbnQoKSsNCiAgeWxpbSgwLCAxNzAwICkrDQogIGxhYnModGl0bGUgPSAiUG96b3MuIENvbXBhcmFjacOzbiBkZSBmdWVudGVzIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQ0KZ2dwbG90bHkoZ3JhZl9wb3pvcywgd2lkdGggPSA4MDAsIGhlaWdodCA9IDQwMCkNCmBgYA0KDQoNCnZlciByZWxhY2lvbmVzDQoqIFBCSSBoaWRyb2NhcmJ1cm9zIC8gUEJJIHRvdGFsICh2ZXIgY3VhbCBlbGVnaXIpDQoqIGNvcnJlZ2lyIG51ZXN0cm8gVkJQIGRlcHVyYW5kbyBzZXJ2aWNpb3MNCiogTUlQJ3MgY29lZiB0ZWNuaWNvIChwYXJhIHZlciBDSSBlbiBlbCBzZWN0b3IgcGV0cm9sZXJvIHkgcGVzbyBkZWwgc2VjdG9yIHBldHJvbGVybyBlbiBQQkkpDQoNCiogc3RvY2sgcGV0cm9sZXJvIC8gc3RvY2sgdG90YWwgSklDLEVNIA0KKiBTdG9jayBleHRyYWNjaW9uID0gUFB5RSBQQUUgKyBQUHlFIFRlY3AgKyBQUHlFIFBldHJvYnJhcyB1cHN0ciArIEFjdGl2byBZUEYgdXBzdHJlYW0NCiAgKiB2ZXIgcXVlIHBvcmNlbnRhamUgcXVlIHJlcHJlc2VudGFuIGVzdGFzIGVtcHJlc2FzIGVuIGxhIHByb2R1Y2Npb24gbyBwb3pvcyB5IHZlciBkZSBhbXBsaWFybG8gDQogICogdmVyIHJlbGFjaW9uIEFjdGl2byBZUEYgdXBzdHJlYW0gLyBQUHlFIGludGVncmFkYSBZUEYNCiAgKiB2ZXIgcmVsYWNpb24gZ2FuYW5jaWFzIEFGSVAgeSBCT0xTQVIgY29uIGVsIHN0b2NrIGNvcnJlc3BvbmRpZW50ZSAoY29oZXJlbmNpYSkgDQogICogdmVyIHJlbGFjaW9uIGNvbiBDb3JlbWJlcmcNCiAgKiBwYXNhciBFTkdFIA0KDQoqZ3JpbmJlcmcNCiAgKiBjb252ZXJ0aXIgbG8gbnVlc3RybyBhIGNvc3Rvcy4gYWdhcnJhciBudWVzdHJvcyB2YWxvciB5IGRpdmlkaXJsbyBwb3IgYmFycmlsZXMgKHN1bWFuZG8gZ2FzIGVuIEJPRSkNCiAgKiBjb3N0b3MgcG9yIGJibCwgcHJlY2lvIGVsIGJhcnJpbCB5IHByZWNpbyBkZSBwcm9kdWNjaW9uIChzdW1vIGxhIGdjaWEgbm9ybWFsIGFsIGNvc3RvMSkNCg0KDQojIyBBY3Rpdm9zDQoNClBhc2FyIGRhdG9zIGRlIGJzIGRlIHVzbyBlbiB5YWNpbWllbnRvcyBwYXJhIGFybWFyIHJlbGFjacOzbiBhY3Rpdm8geWFjaW1laW50by90b3RhbA0KDQpGdWVudGVzOg0KDQoqIEJhbGFuY2VzIGRlIEJvbHNhciAodW5pY2FtZW50ZSBlbXByZXNhcyBxdWUgY290aXphbiBlbiBsYSBib2xzYSBkZSB2YWxvcmVzIGFyZ2VudGluYSkuIFJldmlzYXIgZWwgc3RvY2sgZGVsIHNlY3RvciBkaXN0cmlidWNpw7NuIHBvcnF1ZSBzZSBwcmVzZW50YSBkZW1hc2lhZG8gZ3JhbmRlIGNvbiByZXNwZWN0byBhbCBkZSBsb3MgZGVtw6FzLiBGYWx0YSBwYXNhciBsb3MgZGF0b3MgZGVsIGFjdGl2byBkZSBjYXNpIHRvZGFzIGxhcyBlbXByZXNhcw0KKiBBRklQLiBDb24gZXN0YSBmdWVudGUgbm8gdGVuZW1vcyBjYWxjdWxvIGRlIHJlbnRhLCBzaW5vIHF1ZSBzb2xvIHVzYW1vcyBsYSBURyBjb21vIHBhcsOhbWV0cm8uIE5vdGE6ICJfYyIgc2lnbmlmaWNhIGNhc29zIHByZXNlbnRhZG9zIGRlIGxhIHZhcmlhYmxlIGNvcnJlc3BvbmRpZW50ZQ0KKiBNZW1vcmlhcyBkZSBZUEYuIExhIGTDqWNhZGEgZGUgbG9zIDgwIHByZXNlbnRhIHBpY29zIHF1ZSBoYXkgcXVlIHJldmlzYXINCg0KDQoqIENhbGN1bG8gZGVsIENhcGl0YWwgVG90YWwgQWRlbGFudGFkbyAoS1RBKSANCg0KICArIEJvbHNhcjogRXMgZXF1aXZhbGVudGUgYSBsYSBzdW1hIGRlIFByb3BpZWRhZCwgUGxhbnRhIHkgRXF1aXBvcyBOZXRhIChkZXNjb250YW5kbyBsb3MgdGVycmVub3MgeSBvYnJhcyBlbiBjdXJzbykgeSBsb3MgSW52ZW50YXJpb3MuIEN1YW5kbyBsb3MgZGF0b3MgbG8gaGFiaWxpdGFuLCBzZSBsZSBhZ3JlZ8OzIGxvcyBzYWxhcmlvcyBhZGVsYW50YWRvcyAoc2FsYXJpb3MgeSBjYXJnYXMgY29uc3VtaWRvcyBzb2JyZSByb3RhY2nDs24pLiBMdWVnbywgY3VhbmRvIG5vIHNlIHByZXNlbnRhcm9uIGRhdG9zIGRlIFByb3BpZWRhZCwgUGxhbnRhIHkgRXF1aXBvcywgc2UgdG9tw7MgZWwgYWN0aXZvIG5vIGNvcnJpZW50ZS4NCiAgKyBBRklQOiBFcyBlcXVpdmFsZW50ZSBhIGxhIHN1bWEgZGUgQmllbmVzIGRlIFVzbywgQmllbmVzIGRlIENhbWJpbywgSW52ZW50YXJpb3MgeSBEaXNwb25pYmlsaWRhZGVzLg0KICArIE1lbW9yaWEgWVBGOiBTdW1hIGRlIEJpZW5lcyBkZSBVc28geSBCaWVuZXMgZGUgQ2FtYmlvDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBCT0xTQVINCg0KI3NlZ21lbnRvcyBkZSBZUEYgeSBQZXRyb2JyYXMNCnlwZl9zZWcgPC0gcmVhZF9kZWxpbSgiQzovQXJjaGl2b3MvRGF0b3MvQmFsYW5jZXMvZ2FzIHkgcGV0cm9sZW9fZGF0b3MvZGF0b3Nfci95cGZfc2VnbWVudG9zLmNzdiIsIA0KICAgICIsIiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lIA0KICBzZWxlY3QoLVgxKSAlPiUgDQogIG11dGF0ZShzZWN0b3IgPSBjYXNlX3doZW4oIHNlY3RvciA9PSAgInF1aW1pY2EiIH4gInBldHJvcXVpbWljYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBzZWN0b3IpLA0KICAgICAgICAgYW5pbyA9IHllYXIoZmVjaGEpKQ0KDQpwZXRyb2JyYXNfYXJfc2VnIDwtIHJlYWRfZGVsaW0oIkM6L0FyY2hpdm9zL0RhdG9zL0JhbGFuY2VzL2dhcyB5IHBldHJvbGVvX2RhdG9zL2RhdG9zX3IvcGV0cm9icmFzX2FyZ19zZWdtZW50b3MuY3N2IiwgDQogICAgIiwiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSU+JSANCiAgc2VsZWN0KC1YMSkNCg0KdW5pb25fc2VnbWVudG9zIDwtIHlwZl9zZWcgJT4lIA0KICBzZWxlY3QoYW5pbywgZW1wcmVzYSxzZWN0b3IsIHVuaWRhZCwgYWN0aXZvID0gYWN0aXZvcykgJT4lIA0KICBiaW5kX3Jvd3MocGV0cm9icmFzX2FyX3NlZyAlPiUgDQogICAgICAgICAgICAgIHJlbmFtZShhbmlvID0gZmVjaGEpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8gLCBlbXByZXNhLCB1bmlkYWQsIHNlY3RvciwgcHJvcF9wbGFudGFfZXF1aXBvID0gcHB5ZSwgYWN0aXZvID0gYWN0aXZvcykpICU+JSANCiAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDU6bmNvbCguKSkgJT4lDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUgDQogIG11dGF0ZSh2YWxvciA9dmFsb3IvaXBjXzE4LA0KICAgICAgICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIDIwMTgiKSAlPiUgDQogIHNlbGVjdCgtaXBjXzE4KQ0KDQpzdG9ja19zZWdtZW50b3MgPC0gdW5pb25fc2VnbWVudG9zICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgc2VjdG9yLCB2YXJpYWJsZSAsdW5pZGFkICkgJT4lIA0KICBzdW1tYXJpc2UodmFsb3IgPSBzdW0odmFsb3IsIG5hLnJtID0gVCkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKGZ1ZW50ZSA9ICJBY3Rpdm8gZGUgWVBGIHkgUGV0cm9icmFzIiwNCiAgICAgICAgIHZhcmlhYmxlX3NlY3RvciA9IHBhc3RlKHZhcmlhYmxlLCBzZWN0b3IsIHNlcCA9ICIgIikpDQoNCg0KIyMgU3RvY2sgcG9yIGVtcHJlc2FzDQpzdG9ja19iYWxhbmNlc19lbXByZXNhcyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvQmFsYW5jZXMvZ2FzIHkgcGV0cm9sZW9fZGF0b3MvZGF0b3Nfci9yZXN1bHRhZG9zL2JhbGFuY2VzX2FyZy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpICU+JSANCiAgZmlsdGVyKCAhKGVtcHJlc2EgJWluJSBjKCJjaGV2cm9uX2dsb2JhbCIsICJwZXRyb2JyYXNfZ2xvYmFsIiApKSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIDIwMTgiLA0KICAgICAgICAgYW5pbyA9IHllYXIoZmVjaGEpLA0KICAgICAgICAgZnVlbnRlID0gIkJvbHNhciIpICU+JQ0KICBzZWxlY3QoYW5pbyxmdWVudGUsIGV2ZXJ5dGhpbmcoLiksIC1jKGZlY2hhLCBwYWlzLCB0Z19hbnQsIHRnX2Rlc3AsIHJvdGFjaW9uKSkgJT4lIA0KICAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDY6bmNvbCguKSkgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lIA0KICBtdXRhdGUodmFsb3IgPSB2YWxvciAvaXBjXzE4LA0KICAgICAgICAgZW1wcmVzYSA9IGNhc2Vfd2hlbihlbXByZXNhID09ICJwZXRyb2JyYXNfYXIiIH4gIlBldHJvYnJhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gInRlY3BldHJvbCIgfiAiVGVjcGV0cm9sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiY2FtdXp6aV9wYW1wIiB+ICJDYW11enppIEdhcyBQYW1wZWFuYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIm1ldHJvZ2FzIiB+ICJNZXRyb2dhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBlbXByZXNhKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCBlbXByZXNhLGZ1ZW50ZSwgc2VjdG9yLCB1bmlkYWQsIHZhcmlhYmxlKSAlPiUNCiAgc3VtbWFyaXNlKHZhbG9yID0gc3VtKHZhbG9yLCBuYS5ybSA9IFQpKSAlPiUNCiAgZmlsdGVyKHZhcmlhYmxlICVpbiUgYygiS1RBIiwgInBweWUiLCAicHB5ZV9uZXRhIiAsICJpbnZlbnRhcmlvcyIsICJhY3Rpdm9fbm9fY29yciIsICJhY3Rpdm8iKSkNCiAgICANCg0KDQojIyBTdG9jayBwb3IgcmFtYQ0Kc3RvY2tfYmFsYW5jZXNfcmFtYSA8LSAgc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIGJpbmRfcm93cyhzdG9ja19zZWdtZW50b3MgJT4lIA0KICAgICAgICAgICAgICAjIGZpbHRlcihzZWN0b3IgPT0gInVwc3RyZWFtIiAmIHZhcmlhYmxlID09ICJhY3Rpdm8iKSAlPiUNCiAgICAgICAgICAgICAgZmlsdGVyKHZhcmlhYmxlX3NlY3RvciA9PSAiYWN0aXZvIHVwc3RyZWFtIikgJT4lDQogICAgICAgICAgICAgIHNlbGVjdCgtdmFyaWFibGVfc2VjdG9yKSAlPiUNCiAgICAgICAgICAgICAgbXV0YXRlKHNlY3RvciA9IGNhc2Vfd2hlbihzZWN0b3IgPT0gInVwc3RyZWFtIiB+ICJwcm9kdWNjaW9uIiksDQogICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSA9ICBjYXNlX3doZW4odmFyaWFibGUgPT0gImFjdGl2byIgfiAicHB5ZSIpLA0KICAgICAgICAgICAgICAgICAgICAgZnVlbnRlID0gIkJvbHNhciIsDQogICAgICAgICAgICAgICAgICAgICBlbXByZXNhID0iWVBGIHkgUGV0cm9icmFzIikpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgc2VjdG9yLHZhcmlhYmxlLCB1bmlkYWQsIGZ1ZW50ZSkgJT4lDQogIHN1bW1hcmlzZSh2YWxvciA9IHN1bSh2YWxvciwgbmEucm0gPSBUKSkgIA0KICANCiAgIyBzcHJlYWQoa2V5ID0gc2VjdG9yLA0KICAjICAgICAgICB2YWx1ZSA9IEtUQSkgJT4lIA0KICAjIG11dGF0ZShpbnRlZ3JhZGFfeV9leHRyYWNjaW9uID0gaW50ZWdyYWRhICsgcHJvZHVjY2lvbiwNCiAgIyAgICAgICAgdmFyaWFibGUgPSAiS1RBIikgJT4lIA0KICAjIHJlbmFtZShleHRyYWNjaW9uID0gcHJvZHVjY2lvbikgJT4lIA0KICAjIHNlbGVjdChhbmlvLCB2YXJpYWJsZSwgbW9uZWRhLCBldmVyeXRoaW5nKC4pKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBUYXNhcyBkZSBkZXByZWNpYWNpb24NCiNBRklQDQp0YXNhX2RlcHJlY2lhY2lvbl9hZmlwIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0FGSVAvZ2NpYV92OC54bHN4IiwgDQogICAgc2tpcCA9IDQpICU+JQ0KICBzZWxlY3QoLWMoNDk6bmNvbCguKSkpICU+JSANCiAgZ3JvdXBfYnkoIHJhbWEsIHllYXIpICU+JSANCiAgc3VtbWFyaXNlKHRhc2FfZGVwcmVjaWFjaW9uID0gZGVwcmVjaWFjaW9uYnN1c28vYnN1c28pDQojQmFsYW5jZXMNCnJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9CYWxhbmNlcy9nYXMgeSBwZXRyb2xlb19kYXRvcy9kYXRvc19yL3Jlc3VsdGFkb3MvYmFsYW5jZXNfYXJnLmNzdiIsIA0KICAgICAgICAgY29sX3R5cGVzID0gY29scyhYMSA9IGNvbF9za2lwKCkpKSAlPiUNCiAgICBmaWx0ZXIoZW1wcmVzYSA9PSAiWVBGIikgJT4lIA0KICAgIGdyb3VwX2J5KGVtcHJlc2EpICU+JSANCiAgICBtdXRhdGUodGFzYV9kZXByZWNpYWNpb24gPSBkZXByZWNpYWNpb25lcy9wcHllKSAlPiUgDQogIHNlbGVjdChmZWNoYSwgZW1wcmVzYSwgdGFzYV9kZXByZWNpYWNpb24pDQoNCg0KIyMjQUZJUA0KIyBTdG9jayBkZSBiYWxhbmNlcyAtICBBRklQDQpkYXRvc19hZmlwIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0FGSVAvZ2NpYV92OC54bHN4IiwgDQogICAgc2tpcCA9IDQpICU+JQ0KICBzZWxlY3QoLWMoNDk6bmNvbCguKSkpICAlPiUgDQogIHJlbmFtZShhbmlvID0geWVhciwNCiAgICAgICAgIGlkc2VjdG9yID0gaWRyYW1hKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAicGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICBzZWN0b3IgPSBjYXNlX3doZW4oIHJhbWEgPT0gInBldHJvIiB+ICJleHRyYWNjaW9uX3BldHJvbGVvX2dhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByYW1hID09ICJzZXJfcGV0cm8iIH4gInNlcnZpY2lvc19wZXRyb2xlcm9zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiByYW1hKSklPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGlkc2VjdG9yLCBzZWN0b3IsIGV2ZXJ5dGhpbmcoLiksIC1yYW1hKQ0KZGF0b3NfYWZpcA0KDQoNCnN0b2NrX2FmaXAgPC0gZGF0b3NfYWZpcCAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIGlkc2VjdG9yLCBzZWN0b3IsIHVuaWRhZCkgJT4lIA0KICBzdW1tYXJpc2UoS1RBID0gZGlzcG9uaWJpbGlkYWRlcyArIGJzY2FtYmlvICsgaW52ZW50YXJpb3MgKyBic3VzbywNCiAgICAgICAgICAgIHBweWUgPSBzdW0oYnN1c28sIG5hLnJtID0gVCksDQogICAgICAgICAgICBhY3Rpdm8gPSBzdW0oYWN0aXZvLCBuYS5ybSA9IFQpKSAlPiUNCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JQ0KICBtdXRhdGUoS1RBID0gKEtUQS8xMF42KSAvIGlwY18xOCwNCiAgICAgICAgIHBweWU9IChwcHllLzEwXjYpIC8gaXBjXzE4LA0KICAgICAgICAgYWN0aXZvPSAoYWN0aXZvLzEwXjYpIC8gaXBjXzE4LA0KICAgICAgICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIDIwMTgiKSAlPiUgDQogIGFycmFuZ2UoaWRzZWN0b3IpICU+JSANCiAgZmlsdGVyKHNlY3RvciAlaW4lIGMoImV4dHJhY2Npb25fcGV0cm9sZW9fZ2FzIiwgInNlcnZpY2lvc19wZXRyb2xlcm9zIikpICU+JQ0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoLWMoaWRzZWN0b3IsIGlwY18xOCkpICU+JSANCiAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDQ6bmNvbCguKSkgJT4lIA0KICBtdXRhdGUoZnVlbnRlID0gIkFGSVAiKQ0Kc3RvY2tfYWZpcA0KDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyANCiMgTWVtb3JpYXMgWVBGIA0KYmFsYW5jZV95cGYgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9FeGNlbHMgZGUgQmV0YW5pYS9DYWxjdWxvcyBCZXRhbmlhIFRnLnhscyIsIA0KICAgIHNoZWV0ID0gIllQRl9BICRIT1lfUEFSQURFRkxBQ1lDQUxDVUxBUiIsIA0KICAgIHNraXAgPSAxKSAlPiUgDQogIHNlbGVjdCgtYygxMjpuY29sKC4pKSkgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw7FvIiwNCiAgICAgICAgIHVuaWRhZCA9IG1vbmVkYSwNCiAgICAgICAgIHZlbnRhcyA9ICJWZW50YXMuLi4zIiwNCiAgICAgICAgIGNvc3RvX3ZlbnRhcyA9ICJDb3N0byBkZSBsYXMgVmVudGFzLi4uNCIsDQogICAgICAgICB1dGlsaWRhZF9uZXRhID0gIlV0aWxpZGFkIG5ldGEiLA0KICAgICAgICAgdXRpbGlkYWRfb3BlcmF0aXZhID0gIlV0aWxpZGFkIG9wZXJhdGl2YSIsDQogICAgICAgICBwcHllID0gIkJzIFVzbyIsDQogICAgICAgICBiaWVuZXNfZGVfY2FtYmlvID0gIkJzIENhbWJpbyIsDQogICAgICAgICB1dGlsaWRhZF9uZXRhX2FudGVzX2ltcHVlc3RvcyA9ICJVTiBhbnRlcyBkZSBpbXB1ZXN0b3MgKGfCtCBhY3Rpdm9zIHkgZGl2aWRlbmRvcykiLA0KICAgICAgICAgYWN0aXZvID0gIkFjdGl2byBUb3RhbCIsDQogICAgICAgICBwYXRyaW1vbmlvX25ldG8gPSAiUGF0cmltb25pbyBOZXRvIikgJT4lDQogIGZpbHRlcighKGlzLm5hKGFuaW8pKSkgJT4lDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkge3ggLyAxMF42fSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUNCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyAgZGUgMjAxOCIsDQogICAgICAgICB2ZW50YXMgPXZlbnRhcy9pcGNfMTgsDQogICAgICAgICBjb3N0b192ZW50YXMgPSBjb3N0b192ZW50YXMvaXBjXzE4LA0KICAgICAgICAgdXRpbGlkYWRfbmV0YSA9IHV0aWxpZGFkX25ldGEvaXBjXzE4LA0KICAgICAgICAgdXRpbGlkYWRfb3BlcmF0aXZhID0gdXRpbGlkYWRfb3BlcmF0aXZhL2lwY18xOCwNCiAgICAgICAgIHBweWUgPSBwcHllL2lwY18xOCwNCiAgICAgICAgIGJpZW5lc19kZV9jYW1iaW8gPSBiaWVuZXNfZGVfY2FtYmlvL2lwY18xOCwNCiAgICAgICAgIHV0aWxpZGFkX25ldGFfYW50ZXNfaW1wdWVzdG9zID0gdXRpbGlkYWRfbmV0YV9hbnRlc19pbXB1ZXN0b3MvaXBjXzE4LA0KICAgICAgICAgYWN0aXZvID0gYWN0aXZvL2lwY18xOCwNCiAgICAgICAgIHBhdHJpbW9uaW9fbmV0byA9IHBhdHJpbW9uaW9fbmV0by9pcGNfMTgsDQogICAgICAgICBLVEEgPSBwcHllICsgYmllbmVzX2RlX2NhbWJpbywNCiAgICAgICAgIHNlY3RvciA9ICJNZW1vcmlhIGRlIFlQRiIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHNlY3RvciwgdW5pZGFkLCBldmVyeXRoaW5nKC4pKSANCmJhbGFuY2VfeXBmDQoNCnN0b2NrX3lwZiA8LSBiYWxhbmNlX3lwZiAlPiUgDQogIGdhdGhlcihrZXkgPSB2YXJpYWJsZSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsIA0KICAgICAgICAgNDpuY29sKC4pKSAlPiUgDQogIGZpbHRlcih2YXJpYWJsZSAlaW4lIGMoIktUQSIsICJhY3Rpdm8iLCAicHB5ZSIpKSAlPiUgDQogIG11dGF0ZSh2YWxvciA9IGNhc2Vfd2hlbihhbmlvID09IDE5ODMgfiAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA9PSAxOTg1IH4gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPT0gMTk4NiB+IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID09IDE5ODcgfiAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA9PSAxOTg4IH4gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB2YWxvcikpICU+JQ0KICBiaW5kX3Jvd3Moc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMgJT4lIA0KICAgIHVuZ3JvdXAoKSAlPiUgDQogICAgc2VsZWN0KGFuaW8sICBzZWN0b3IgPWVtcHJlc2EsIHVuaWRhZCwgdmFyaWFibGUsIHZhbG9yICkgJT4lIA0KICAgIGZpbHRlcihzZWN0b3IgPT0gIllQRiIsDQogICAgICAgICAgIHZhcmlhYmxlICAlaW4lIGMoIktUQSIsICJhY3Rpdm8iLCAicHB5ZSIpKSkNCiAgDQoNCmBgYA0KDQojIyMgU3RvY2sgdG90YWwgZGUgbGEgcmFtYSANCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIFN0b2NrIGRlIGxhIHJhbWENCnN0b2NrX3JhbWEgPC0gc3RvY2tfYWZpcCAlPiUgDQogIGJpbmRfcm93cyhzdG9ja19iYWxhbmNlc19yYW1hKQ0KDQojIHdyaXRlLmNzdihzdG9ja19yYW1hLCBmaWxlID0iL0FyY2hpdm9zL0RhdG9zL1N0b2NrL3N0b2NrX2hpZHJvY2FyYnVyb3MuY3N2IikNCg0KDQpncmFmX3N0b2NrX3JhbWEgPC0gc3RvY2tfcmFtYSAlPiUgDQogICMgbXV0YXRlKHZhbG9yID0gbnVtYmVyX2Zvcm1hdCh2YWxvciwgYmlnLm1hcmsgPSAiICIgKSkgJT4lIA0KICBmaWx0ZXIoc2VjdG9yICE9ICJkaXN0cmlidWNpb24iKSAlPiUNCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSBzZWN0b3IsIHNoYXBlID0gZnVlbnRlKSkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KHNpemUgPSAuOCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJTdG9jayBkZSBjYXBpdGFsIGFkZWxhbnRhZG8geSBhY3Rpdm8gZGUgc2VnbWVudG9zIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJTdWJzZWN0b3JlcyBkZWwgc2VjdG9yIGhpZHJvY2FyYnVyw61mZXJvIiwNCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICBmYWNldF93cmFwKH4gdmFyaWFibGUgKQ0KDQpnZ3Bsb3RseShncmFmX3N0b2NrX3JhbWEsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA0MDApDQpgYGANCg0KDQojIyMgU3RvY2sgZGUgc2VnbWVudG9zIGRlIFlQRiB5IFBldHJvYnJhcw0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdyYWZfc3RvY2tfc2VnbWVudG9zIDwtIHVuaW9uX3NlZ21lbnRvcyAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gc2VjdG9yKSkrDQogIGdlb21fbGluZSgpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiU3RvY2sgZGUgY2FwaXRhbCBkZSBzZWdtZW50b3MiLA0KICAgICAgIHN1YnRpdGxlID0gIllQRiB5IFBldHJvYnJhcyBBcmdlbnRpbmEiLA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIGZhY2V0X3dyYXAodmFyaWFibGUgfiBlbXByZXNhICkNCg0KZ2dwbG90bHkoZ3JhZl9zdG9ja19zZWdtZW50b3MsIHdpZHRoID0gNzAwLCBoZWlnaHQgPSA1MDApDQoNCg0KYGBgDQoNCiMjIyBTdG9jayBwb3IgZW1wcmVzYXMNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KZ3JhZl9zdG9ja19lbXAgPC0gc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMgJT4lDQogIGZpbHRlcigNCiAgICAjIHZhcmlhYmxlICVpbiUgYygiS1RBIiwgImFjdGl2byIpLA0KICAgICAgICAgc2VjdG9yICE9ICJkaXN0cmlidWNpb24iKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gZW1wcmVzYSkpKyANCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgbGFicyh0aXRsZSA9ICJTdG9jayBkZSBjYXBpdGFsIHBvciBlbXByZXNhIiwNCiAgICAgICAgeSA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikrDQogIGZhY2V0X3dyYXAofnZhcmlhYmxlKQ0KZ2dwbG90bHkoZ3JhZl9zdG9ja19lbXAsIHdpZHRoID0gNzAwLCBoZWlnaHQgPSA1MDApDQoNCg0KYGBgDQoNCiMjIyBZUEYgbGFyZ28gcGxhem8NCkNvbXBhcmFjacOzbiBlbnRyZSBsYSBNZW1vcmlhIFlQRiAocmVjb3BpbGFkbyBwb3IgQkZSKSB5IGxvcyBiYWxhbmNlcyBleHRyw61hZG9zIGRlIEJvbHNhcg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KZ3JhZl9zdG9ja195cGYgPC0gIHN0b2NrX3lwZiAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gc2VjdG9yKSkrIA0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICBsYWJzKHRpdGxlID0gIlN0b2NrIGRlIGNhcGl0YWwgZGUgWVBGIiwNCiAgICAgICAgeSA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikrDQogIGZhY2V0X3dyYXAofnZhcmlhYmxlKQ0KZ2dwbG90bHkoZ3JhZl9zdG9ja195cGYsIHdpZHRoID0gNzAwLCBoZWlnaHQgPSA1MDApDQoNCmBgYA0KDQojIyMgRXN0aW1hY2nDs24gZGUgc3RvY2sgZGUgY2FwaXRhbCBhIHBhcnRpciBkZSBsYSBldm9sdWNpw7NuIGRlIHBvem9zIHBlcmZvcmFkb3MNCg0KDQpFbCBlamVyY2ljaW8gY29uc2lzdGUgZW4gdmVyaWZpY2FyIHNpIGxvcyBwb3pvcyB0ZXJtaW5hZG9zIHNpcnZlbiBjb21vIGluZGljYWRvciBkZSBsYSBpbnZlcnNpw7NuIHksIHBvciBsbyB0YW50bywgZGUgYXByb3hpbWFkb3IgYWwgc3RvY2sgZGUgY2FwaXRhbCBhZGVsYW50YWRvLiBQYXJhIGVsbG8gc2UgcGFydGUgZGUgdW4gYcOxbyBiYXNlIGRlIGxhIHNlcmllIGRlIFByb3BpZWRhZCwgUGxhbnRhIHkgRXF1aXBvIGRlbCBzZWN0b3IgZXh0cmFjY2nDs24gZGUgQm9sc2FyIHkgQUZJUCwgcGFyYSBsdWVnbyBpbmRleGFyIGxhcyB2YXJpYWJsZXMgcG9yIGxhIGV2b2x1Y2nDs24gZGUgbG9zIHBvem9zLiBMb3MgYmFsYW5jZXMgZGUgQm9sc2FyIHF1ZSBjb3JyZXNwb25kZW4gw7puaWNhbWVudGUgYSBleHRyYWNjacOzbiBzb24gZG9zOiBQQUUgeSBUZWNwZXRyb2wsIHBvciBsbyBxdWUgZWwgdmFsb3Igb2J0ZW5pZG8gcHVlZGUgZXN0YXIgc3VicmVwcmVzZW50YWRvIHBhcmEgZGFyIGN1ZW50YSBkZWwgdG90YWwgZGUgbGEgcmFtYS4gQ29uIHJlc3BlY3RvIGFsIMOtbmRpY2UgZGUgcG96b3MsIHNlIHRvbWFyb24gZG9zIHNlcmllcyBhbHRlcm5hdGl2YXM6IHVuYSBjb25zdHJ1w61kYSBhIHBhcnRpciBkZWwgc3RvY2sgZGUgcG96b3MgZW4gZXh0cmFjY2nDs24gZWZlY3RpdmEgKGZ1ZW50ZTogSUFQRykgeSBvdHJhIGVsYWJvcmFkYSBjb24gbG9zIHBvem9zIHRlcm1pbmFkb3MgYW51YWxlcyBjYXJnYWRvcyBwb3IgZW1wcmVzYSBvcGVyYWRvcmEgKGZ1ZW50ZTogU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEpLiAgDQoNCkVsIGHDsW8gYmFzZSBlbGVnaWRvIGVzIDIwMDYsIGRhZG8gcXVlIGVzIGVsIMO6bHRpbW8gZGF0byBxdWUgcG9zZWVtb3MgZGVsIHN0b2NrIGRlIHBvem9zIHRvdGFsZXMgZW4gYWN0aXZpZGFkIGRlIElBUEcuDQoNClNlIHJlYWxpesOzIGxhIG1pc21hIGVzdGltYWNpw7NuIHBhcmEgWVBGLCBmaWx0cmFuZG8gbGFzIHZhcmlhYmxlcyBkZSBQcm9waWVkYWQsIFBsYW50YSB5IEVxdWlwbyAocGFyYSBlbCB0b3RhbCBkZSBsYSBlbXByZXNhLCBwb3IgbG8gcXVlIGluY2x1eWUgbm8gc8OzbG8gZXh0cmFjY2nDs24gc2lubyByZWZpbmFjacOzbiB5IG90cm9zIHJ1YnJvcykgeSBhY3Rpdm8gdG90YWwgZGVsIHVwc3RyZWFtLiBTZSB1dGlsaXrDsyDDum5pY2FtZW50ZSBlbCBpbmRpY2UgZGUgcG96b3MgdGVybWluYWRvcyBhbnVhbGVzIGRlIFlQRiBwYXJhIGVzdGltYXIgbGEgUFB5RSB5IGVsICBhY3Rpdm8sIGRhZG8gcXVlIG5vIHNlIHBvc2VlIHZhbG9yZXMgZGVsIHN0b2NrIGRlIHBvem9zIGVuIHBlcmZvcmFjacOzbiBwYXJhIGxvcyBhw7FvcyBlbiBkb25kZSBleGlzdGVuIHZhbG9yZXMgY29udGFibGVzIHF1ZSBzaXJ2YW4gZGUgYcOxbyBiYXNlLiBMdWVnbywgc2UgZXN0aW3DsyB1biBzdG9jayBkZSBjYXBpdGFsIHRvdGFsIGRlIHJhbWEgYSBwYXJ0aXIgZGUgcG9uZGVyYXIgZWwgc3RvY2sgZGUgWVBGIHBvciBsYSByZWxhY2nDs24gZW50cmUgbG9zIHBvem9zIGRlIFlQRiB5IGxvcyBwb3pvcyB0b3RhbGVzIGRlIGxhIHJhbWEuDQoNCg0KRW4gc8OtbnRlc2lzLCBlbCBsaXN0YWRvIGRlIHZhcmlhYmxlcyBlc3RpbWFkYXMtIGEgcGFydGlyIGRlIGxhcyBkb3Mgc2VyaWVzIGRlIHBvem9zIChzdG9jayB5IGZsdWpvKSxzYWx2byBwYXJhIGxhIGVzdGltYWNpw7NuIGRlIFlQRiBxdWUgc29sbyBzZSBwdWRvIGhhY2VyIGNvbiBmbHVqbyBkZSBwb3pvcyBwb3IgYXVzZW5jaWEgZGUgaW5mb3JtYWNpw7NuLSBlcyBsYXMgc2lndWllbnRlczoNCg0KKiAkcHB5ZVxfZXN0aW1hZG9cX2JvbHNhciQgPSAkUFB5RVwgYcOxb1wgYmFzZVwgZGVcIEJvbHNhciQgKiAkaW5kaWNlXCBkZVwgcG96b3MkDQoqICRwcHllXF9lc3RpbWFkb1xfYWZpcCQgPSAkUFB5RVwgYcOxb1wgYmFzZVwgZGVcIEFGSVAkICogJGluZGljZVwgZGVcIHBvem9zJA0KDQoqICRwcHllXF9lc3RpbWFkb1xfeXBmJCA9ICRQUHlFXCBhw7FvXCBiYXNlXCBkZVwgWVBGJCAqICRpbmRpY2VcIGRlXCBwb3pvc1wgWVBGJA0KKiAkYWN0aXZvXF9lc3RpbWFkb1xfdXBzdHJlYW1cX3lwZiQgPSAkQWN0aXZvXCBhw7FvXCBiYXNlXCBkZVwgWVBGJCAqICRpbmRpY2VcIGRlXCBwb3pvc1wgWVBGJA0KDQoqICRwcHllXF9lc3RpbWFkb1xfdG90YWwkID0gJHBweWVcX2VzdGltYWRvXF95cGYkICogJCRcZnJhY3twb3pvc1wgdG90YWxlc317cG96b3NcIGRlXCBZUEZ9JCQNCg0KKiAkYWN0aXZvXF9lc3RpbWFkb1xfdXBzdHJlYW0kID0gJGFjdGl2b1xfZXN0aW1hZG9cX3Vwc3RyZWFtXF95cGYkICAqICQkXGZyYWN7cG96b3NcIHRvdGFsZXN9e3Bvem9zXCBkZVwgWVBGfSQkDQoNClBhcmEgcG9kZXIgc2VsZWNjaW9uYXIgbGEgZXN0aW1hY2nDs24gbcOhcyBhZGVjdWFkYSwgc2UgcmVhbGl6w7MgdW4gYW7DoWxpc2lzIGRlIGNvcnJlbGFjacOzbiBlbnRyZSB0b2RhcyBsYXMgc2VyaWVzIGVzdGltYWRhcyB5IGxvcyB2YWxvcmVzIGNvbnRhYmxlcyBxdWUgc2UgcG9zZWVuIGRlIFBQeUUgZGUgQUZJUCwgQm9sc2FyIGUgWVBGLiBTZSBwcmVzZW50YW4gZGlzdGludG9zIGN1YWRyb3MgZGUgY29ycmVsYWNpb25lcywgY29uIHN1cyBuaXZsZXMgZGUgc2lnbmlmaWNhbmNpYSwgZGlhZ3JhbWFzIGRlIGRpc3BlcnNpw7NuIGVudHJlIHZhcmlhYmxlcyB5IHN1IGRpc3RyaWJ1Y2nDs24uIExhcyBzZXJpZXMgY29uc3RydcOtZGFzIHF1ZSBwb3NlZW4gbWVqb3IgY29ycmVsYWNpw7NuIHNvbiBsYSBQcm9waWVkYWQsIFBsYW50YSB5IEVxdWlwbyBhIHBhcnRpciBkZSBCb2xzYXIgZXN0aW1hZGFzIGNvbiDDrW5kaWNlIGRlIHN0b2NrIGRlIHBvem9zIChjb3JyZWxhY2nDs24gZnVlcnRlIGRlIDAuODkgeSBzaWduaWZpY2F0aXZhIGFsIDAuMDAxKSB5IGZsdWpvIGRlIHBvem9zIChjb3JyZWxhY2nDs24gbW9kZXJhZGEgZGUgMC41NCB5IHNpZ25pZmljYXRpdmEgYWwgMC4wNSkgeSBsdWVnbyBlbCBhY3Rpdm8gZGVsIHVwc3RyZWFtIHRvdGFsIGRlIGxhIHJhbWEgYSBwYXJ0aXIgZGUgWVBGIChjb3JyZWxhY2nDs24gbW9kZXJhZGEgZGUgMC40MiB5IHNpZ25pZmljYXRpdmEgYWwgMC4xIGNvbiBsb3MgdmFsb3JlcyBjb250YWJsZXMgZGUgWVBGIHkgY29ycmVsYWNpw7NuIGZ1ZXJ0ZSBkZSAwLjg4IHkgc2lnbmlmaWNhdGl2YSBhbCAwLjAwMSBjb24gbGFzIGVzdGltYWNpb25lcyBkZSBQUHlFIGRlIEFGSVAgeSBCb2xzYXIgYSBwYXJ0aXIgZGUgZmx1am8gZGUgcG96b3MpLg0KDQpsYSBlc3RpbWFjacOzbiB0aWVuZSBxdWUgcmVhbGl6YXJzZSBjb24gUFB5RSBwb3JxdWUgaGF5IHF1ZSBleGNsdWlyIHNhbGFyaW9zIGUgaW52ZW50YXJpb3MgKHF1ZSBlc3TDoW4gZW4gS1RBKQ0KDQojIyMjIEFuw6FsaXNpcyBkZSBjb3JyZWxhY2lvbiBlbnRyZSBQcm9waWVkYWQsIFBsYW50YSB5IEVxdWlwbyB5IFBvem9zIGVuIHByb2R1Y2Npw7NuDQoNCg0KcmVlbXBsYXphciBpcGMgcG9yIHVuIGliaWYgbyBpbmRpY2UgZXNwZWNpZmljbw0KDQojIyMjIyBUb3RhbCByYW1hDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpzdG9ja195X3Bvem9zX3Rhc2FzIDwtIHN0b2NrX3JhbWEgJT4lIA0KICBmaWx0ZXIodmFyaWFibGUgPT0gInBweWUiICYgc2VjdG9yICVpbiUgYygiZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMiLCAicHJvZHVjY2lvbiIpKSAlPiUNCiAgc2VsZWN0KGFuaW8sIHZhbG9yLGZ1ZW50ZSkgJT4lDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICBzcHJlYWQoa2V5ID0gZnVlbnRlLCB2YWx1ZSA9IHZhbG9yKSAlPiUgDQogIG11dGF0ZShBRklQID0gdmFyaWFjaW9uX2ludGVyYW51YWwoQUZJUCksDQogICAgICAgICBCb2xzYXIgPSB2YXJpYWNpb25faW50ZXJhbnVhbChCb2xzYXIpKSAlPiUgDQogIGZ1bGxfam9pbihjb21wYXJhY2lvbl9wb3pvcyANCiAgICAgICAgICAgICU+JQ0KICAgICAgICAgICAgIyBzZWxlY3QoLSBwb3pvc19wZXJmb3JhZG9zX2lhcGcpDQogICAgICAgICAgICBzZWxlY3QoLSBwb3pvc192YXJpYWNpb25faWFwZykNCiAgICAgICAgICAgICwgYnkgPSAiYW5pbyIpICU+JQ0KICByZW5hbWUocHB5ZV9hZmlwID0gQUZJUCwNCiAgICAgICAgIHBweWVfYm9sc2FyID0gQm9sc2FyLA0KICAgICAgICAgcG96b3NfaWFwZyA9IHBvem9zX3BlcmZvcmFkb3NfaWFwZywNCiAgICAgICAgICMgcG96b3NfaWFwZ19jZW50ZW5hcmlvID0gcG96b3NfdmFyaWFjaW9uX2lhcGcsDQogICAgICAgICBwb3pvc190ZXJtaW5hZG9zID0gcG96b3NfdGVybWluYWRvc19zZWNfZW5lcmdpYSwNCiAgICAgICAgIHBvem9zX2NhcmdhZG9zID0gcG96b3NfY2FyZ2Fkb3Nfc2VjX2VuZXJnaWEgKSAlPiUgDQogIGFycmFuZ2UoYW5pbykgJT4lDQogIGZpbHRlcihhbmlvID4gMTk5OCkgJT4lDQogIHNlbGVjdCgtYW5pbykgJT4lDQogIG11dGF0ZV9hbGwodGFzYV9jcmVjaW1pZW50bykgIA0KICANCg0KDQpHR2FsbHk6OmdncGFpcnMoc3RvY2tfeV9wb3pvc190YXNhcywgbG93ZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSAic21vb3RoIikpDQpwbG90KHN0b2NrX3lfcG96b3NfdGFzYXMpDQoNCiMgcm91bmQodmFyKHN0b2NrX3lfcG96b3NfdGFzYXMsIG5hLnJtID0gVFJVRSksIDQpDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojbWF0cml6IGRlIGNvcnJlbGFjaW9uDQpjb3JfcG96b3MgPC0gY29yKHN0b2NrX3lfcG96b3NfdGFzYXMsIHVzZSA9ICJjb21wbGV0ZS5vYnMiKQ0KY29yX3Bvem9zDQoNCiMgIGRpc3RpbnRvcyBjb3JyZWxvZ3JhbWFzDQojY29uIGdnY29ycnBsb3QNCmxpYnJhcnkoZ2djb3JycGxvdCkNCnAubWF0ID0gY29yX3BtYXQoc3RvY2tfeV9wb3pvc190YXNhcykNCmdnY29ycnBsb3QoY29yX3Bvem9zLCBoYy5vcmRlciA9IFRSVUUsDQogICAgdHlwZSA9ICJsb3dlciIsIHAubWF0ID0gcC5tYXQsIGxhYiA9IFQpDQoNCiMgIyAjY29uIGNvcnJwbG90DQojIGNvbCA8LSBjb2xvclJhbXBQYWxldHRlKGMoIiNCQjQ0NDQiLCAiI0VFOTk4OCIsICIjRkZGRkZGIiwgIiM3N0FBREQiLCAiIzQ0NzdBQSIpKQ0KIyBjb3JycGxvdDo6Y29ycnBsb3QoY29yX3Bvem9zLCBtZXRob2Q9ImNvbG9yIiwgY29sPWNvbCgyMDApLA0KIyAgICAgICAgICB0eXBlPSJ1cHBlciIsIG9yZGVyPSJoY2x1c3QiLA0KIyAgICAgICAgICBhZGRDb2VmLmNvbCA9ICJibGFjayIsICMgQWRkIGNvZWZmaWNpZW50IG9mIGNvcnJlbGF0aW9uDQojICAgICAgICAgIHRsLmNvbD0iYmxhY2siLCB0bC5zcnQ9NDUsICNUZXh0IGxhYmVsIGNvbG9yIGFuZCByb3RhdGlvbg0KIyAgICAgICAgICAjIENvbWJpbmUgd2l0aCBzaWduaWZpY2FuY2UNCiMgICAgICAgICAgIyBwLm1hdCA9IHAubWF0LA0KIyAgICAgICAgICAjIGluc2lnID0gImJsYW5rIiwNCiMgICAgICAgICAgc2lnLmxldmVsID0gMC4wMSkNCg0KIyAjICNjb24gZ2dnYWxseQ0KIyBHR2FsbHk6OmdnY29ycihzdG9ja195X3Bvem9zX3Rhc2FzLCBtZXRob2QgPSBjKCJjb21wbGV0ZS5vYnMiLCAicGVhcnNvbiIpICwNCiMgICAgICAgICAgICAgICAgbGFiZWwgPSBULCBsYWJlbF9yb3VuZCA9IDIpDQpgYGANCg0KYGBge3J9DQojYcOxb3MgYmFzZSAyMDA2DQpwcHllX2FuaW9fYmFzZV9ib2xzYXIgPC0gKHN0b2NrX3JhbWEgJT4lIA0KICBmaWx0ZXIodmFyaWFibGUgPT0gInBweWUiICYgc2VjdG9yID09ICJwcm9kdWNjaW9uIikgJT4lDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHBweWUgPSB2YWxvcikpDQpwcHllX2FuaW9fYmFzZV9ib2xzYXIgPC0gcHB5ZV9hbmlvX2Jhc2VfYm9sc2FyJHBweWVbcHB5ZV9hbmlvX2Jhc2VfYm9sc2FyJGFuaW8gPT0yMDA2XQ0KDQojIHZhbG9yX2Jhc2UgPC0gc2VyaWVbd2hpY2goZmVjaGE9PWZlY2hhX2Jhc2UpXQ0KDQpwcHllX2FuaW9fYmFzZV9hZmlwIDwtIChzdG9ja19yYW1hICU+JSANCiAgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllIiAmIHNlY3RvciA9PSAiZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMiKSAlPiUNCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHB5ZSA9IHZhbG9yKSkNCnBweWVfYW5pb19iYXNlX2FmaXAgPC0gcHB5ZV9hbmlvX2Jhc2VfYWZpcCRwcHllW3BweWVfYW5pb19iYXNlX2FmaXAkYW5pbyA9PSAyMDA2XQ0KDQoNCnN0b2NrX3lfcG96b3MgPC0gIGNvbXBhcmFjaW9uX3Bvem9zICU+JSANCiAgZ2F0aGVyKGtleSA9IGZ1ZW50ZV9wb3pvLA0KICAgICAgICAgdmFsdWUgPSBjYW50aWRhZF9wb3pvcywNCiAgICAgICAgIDI6bmNvbCguKSkgJT4lDQogIGFycmFuZ2UoZnVlbnRlX3Bvem8sYW5pbykgJT4lIA0KICBncm91cF9ieShmdWVudGVfcG96bykgJT4lIA0KICBtdXRhdGUoaW5kaWNlX3Bvem9zXzA2ID0gZ2VuZXJhcl9pbmRpY2Uoc2VyaWU9IGNhbnRpZGFkX3Bvem9zICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYSA9IGFuaW8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGFfYmFzZSA9IDIwMDYpKSAlPiUgDQogICMgbGVmdF9qb2luKHN0b2NrX3JhbWEgJT4lICANCiAgIyAgICAgICAgICAgICBmaWx0ZXIodmFyaWFibGUgPT0gInBweWUiICYgc2VjdG9yICVpbiUgYygiZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMiLCAicHJvZHVjY2lvbiIpKSAlPiUNCiAgIyAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcHB5ZSA9IHZhbG9yLCBmdWVudGVfc3RvY2sgPSBmdWVudGUpLCBieSA9ICJhbmlvIikgJT4lIA0KICBtdXRhdGUocHB5ZV9hZmlwID0gcHB5ZV9hbmlvX2Jhc2VfYWZpcCAqIGluZGljZV9wb3pvc18wNiwNCiAgICAgICAgIHBweWVfYm9sc2FyID1wcHllX2FuaW9fYmFzZV9ib2xzYXIgKiBpbmRpY2VfcG96b3NfMDYsDQogICAgICAgICB1bmlkYWRfcHB5ZT0iTWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIpICU+JSANCiAgZ2F0aGVyKGtleSA9IGZ1ZW50ZV9wcHllLA0KICAgICAgICAgdmFsdWUgPSBwcHllX2VzdGltYWRvLA0KICAgICAgICAgNTo2KQ0Kc3RvY2tfeV9wb3pvcw0KDQpnZ3Bsb3RseShzdG9ja195X3Bvem9zICU+JSANCiAgZmlsdGVyKGFuaW8gPjE5NjApICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLHBweWVfZXN0aW1hZG8gLCBjb2xvciA9IGZ1ZW50ZV9wb3pvKSkrDQogIGdlb21fbGluZSgpKw0KICBsYWJzKHk9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikrDQogIGZhY2V0X3dyYXAofmZ1ZW50ZV9wcHllICAgICksDQogICAgd2lkdGggPSA4MDAsIGxlbmd0aCA9NTAwKQ0KDQojc3RvY2sgZXN0aW1hZG8gYSBwYXJ0aXIgZGUgcG96b3MNCnN0b2NrX2VzdGltYWRvIDwtIHN0b2NrX3lfcG96b3MgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBmaWx0ZXIoZnVlbnRlX3Bvem8gPT0icG96b3NfY2FyZ2Fkb3Nfc2VjX2VuZXJnaWEiLCBmdWVudGVfcHB5ZSA9PSJwcHllX2JvbHNhciIpICU+JSANCiAgcmVuYW1lKHVuaWRhZCA9IHVuaWRhZF9wcHllLCB2YWxvciA9cHB5ZV9lc3RpbWFkbykgJT4lIA0KICBzZWxlY3QoLWMoY2FudGlkYWRfcG96b3MsIGluZGljZV9wb3pvc18wNiwgZnVlbnRlX3Bvem8pKQ0KDQoNCiNkaWZlcmVuY2lhIGVudHJlIHBweWUgZXN0aW1hZGEgeSB2YWxvciBjb250YWJsZSBkZSBib2xzYXINCnN0b2NrX2VzdGltYWRvICU+JSANCiAgbGVmdF9qb2luKHN0b2NrX3JhbWEgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoZnVlbnRlPT0iQm9sc2FyIiwgdmFyaWFibGUgPT0icHB5ZSIsIHNlY3RvciA9PSAicHJvZHVjY2lvbiIpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHB5ZV9ib2xzYXIgPSB2YWxvcikpICU+JSANCiAgbmEub21pdCgpICU+JSANCiAgbXV0YXRlKGRpZmYgPSAodmFsb3IvcHB5ZV9ib2xzYXIgLTEpKjEwMCkNCg0KI2NhbWJpbyBzdG9jayBzb2xvIHBhcmEgbG9zIGHDsW9zIHF1ZSB0ZW5lbW9zIEJPTFNBUg0Kc3RvY2tfZXN0aW1hZG8gPC0gc3RvY2tfcmFtYSAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihmdWVudGU9PSJCb2xzYXIiLCB2YXJpYWJsZSA9PSJwcHllIiwgc2VjdG9yID09ICJwcm9kdWNjaW9uIikgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLGZ1ZW50ZV9wcHllPWZ1ZW50ZSAsIHZhbG9yKQ0KICANCiAgDQpgYGANCg0KDQojIyMjIyMgU3RvY2sgZGUgcG96b3MNCmBgYHtyfQ0Kc3RvY2tfeV9wb3pvc190YXNhc192MiA8LSBzdG9ja19yYW1hICU+JSANCiAgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllIiAmIHNlY3RvciAlaW4lIGMoImV4dHJhY2Npb25fcGV0cm9sZW9fZ2FzIiwgInByb2R1Y2Npb24iKSkgJT4lDQogIHNlbGVjdChhbmlvLCB2YWxvcixmdWVudGUpICU+JQ0KICBzcHJlYWQoa2V5ID0gZnVlbnRlLCB2YWx1ZSA9IHZhbG9yKSAlPiUgDQogIGZ1bGxfam9pbihwb3pvc19pYXBnX2NlbnRlbmFyaW8lPiUNCiAgICAgICAgICAgIHNlbGVjdChhbmlvLCBwb3pvc19pYXBnID0gdG90YWxlcyApLCBieSA9ICJhbmlvIikgJT4lDQogIHJlbmFtZShwcHllX2FmaXAgPSBBRklQLA0KICAgICAgICAgcHB5ZV9ib2xzYXIgPSBCb2xzYXIgKSAlPiUgDQogIGFycmFuZ2UoYW5pbykgJT4lDQogIGZpbHRlcihhbmlvID4gMTk5OCkgJT4lDQogIHNlbGVjdCgtYW5pbykgJT4lDQogIG11dGF0ZV9hbGwodGFzYV9jcmVjaW1pZW50bykgIA0KICANCg0KDQpHR2FsbHk6OmdncGFpcnMoc3RvY2tfeV9wb3pvc190YXNhc192MiwgbG93ZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSAic21vb3RoIikpDQpwbG90KHN0b2NrX3lfcG96b3NfdGFzYXNfdjIpDQoNCiMgcm91bmQodmFyKHN0b2NrX3lfcG96b3NfdGFzYXMsIG5hLnJtID0gVFJVRSksIDQpDQoNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojbWF0cml6IGRlIGNvcnJlbGFjaW9uDQpjb3JfcG96b3MgPC0gY29yKHN0b2NrX3lfcG96b3NfdGFzYXNfdjIsIHVzZSA9ICJjb21wbGV0ZS5vYnMiKQ0KY29yX3Bvem9zDQoNCiMgIGRpc3RpbnRvcyBjb3JyZWxvZ3JhbWFzDQojY29uIGdnY29ycnBsb3QNCmxpYnJhcnkoZ2djb3JycGxvdCkNCnAubWF0ID0gY29yX3BtYXQoc3RvY2tfeV9wb3pvc190YXNhcykNCmdnY29ycnBsb3QoY29yX3Bvem9zLCBoYy5vcmRlciA9IFRSVUUsDQogICAgdHlwZSA9ICJsb3dlciIsIHAubWF0ID0gcC5tYXQsIGxhYiA9IFQpDQoNCiMgIyAjY29uIGNvcnJwbG90DQojIGNvbCA8LSBjb2xvclJhbXBQYWxldHRlKGMoIiNCQjQ0NDQiLCAiI0VFOTk4OCIsICIjRkZGRkZGIiwgIiM3N0FBREQiLCAiIzQ0NzdBQSIpKQ0KIyBjb3JycGxvdDo6Y29ycnBsb3QoY29yX3Bvem9zLCBtZXRob2Q9ImNvbG9yIiwgY29sPWNvbCgyMDApLA0KIyAgICAgICAgICB0eXBlPSJ1cHBlciIsIG9yZGVyPSJoY2x1c3QiLA0KIyAgICAgICAgICBhZGRDb2VmLmNvbCA9ICJibGFjayIsICMgQWRkIGNvZWZmaWNpZW50IG9mIGNvcnJlbGF0aW9uDQojICAgICAgICAgIHRsLmNvbD0iYmxhY2siLCB0bC5zcnQ9NDUsICNUZXh0IGxhYmVsIGNvbG9yIGFuZCByb3RhdGlvbg0KIyAgICAgICAgICAjIENvbWJpbmUgd2l0aCBzaWduaWZpY2FuY2UNCiMgICAgICAgICAgIyBwLm1hdCA9IHAubWF0LA0KIyAgICAgICAgICAjIGluc2lnID0gImJsYW5rIiwNCiMgICAgICAgICAgc2lnLmxldmVsID0gMC4wMSkNCg0KIyAjICNjb24gZ2dnYWxseQ0KIyBHR2FsbHk6OmdnY29ycihzdG9ja195X3Bvem9zX3Rhc2FzLCBtZXRob2QgPSBjKCJjb21wbGV0ZS5vYnMiLCAicGVhcnNvbiIpICwNCiMgICAgICAgICAgICAgICAgbGFiZWwgPSBULCBsYWJlbF9yb3VuZCA9IDIpDQpgYGANCg0KDQojIyMjIyBZUEYNCmBgYHtyfQ0KcHB5ZV95cGYgPC0geXBmX3NlZyAlPiUgDQogIGZpbHRlcihzZWN0b3IgID09ICJ1cHN0cmVhbSIgKSAlPiUgDQogIG11dGF0ZShhbmlvID0geWVhcihmZWNoYSkpICU+JSANCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBpcGNfMTgpLCBieSA9ICJhbmlvIikgJT4lIA0KICBtdXRhdGUodmFyaWFibGUgPSAiYWN0aXZvX3Vwc3RyZWFtX3lwZiIsDQogICAgICAgICBhY3Rpdm9zID0gYWN0aXZvcy9pcGNfMTgsDQogICAgICAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIpJT4lIA0KICBzZWxlY3QoYW5pbywgZW1wcmVzYSwgdW5pZGFkICwgIGFjdGl2b191cHN0cmVhbT0gYWN0aXZvcykgJT4lIA0KICBsZWZ0X2pvaW4oc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMgJT4lIA0KICAgIHVuZ3JvdXAoKSAlPiUgDQogICAgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllIiAmIGVtcHJlc2EgPT0gIllQRiIpICU+JQ0KICAgIHNlbGVjdChhbmlvLCBlbXByZXNhLCB1bmlkYWQsIHBweWVfaW50ZWdyYWRhID12YWxvcikgLCBieSA9IGMoImFuaW8iLCAiZW1wcmVzYSIsICJ1bmlkYWQiKSkgJT4lIA0KICBtdXRhdGUoYWN0aXZvX3Vwc3RyZWFtID0gdmFyaWFjaW9uX2ludGVyYW51YWwoYWN0aXZvX3Vwc3RyZWFtKSwNCiAgICAgICAgIHBweWVfaW50ZWdyYWRhID0gdmFyaWFjaW9uX2ludGVyYW51YWwocHB5ZV9pbnRlZ3JhZGEpKSAlPiUgDQogIGZ1bGxfam9pbihsaXN0YWRvX3Bvem9zICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoLWVtcHJlc2EpICU+JSANCiAgICAgICAgICAgICAgdW5ncm91cCgpICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKGlkZW1wcmVzYSA9PSAiWVBGIikgJT4lIA0KICAgICAgICAgICAgICByZW5hbWUoYW5pbyA9IGFuaW9fdGVybWluYWNpb25fcG96bywgZW1wcmVzYSA9IGlkZW1wcmVzYSksIGJ5ID0gYygiYW5pbyIsICJlbXByZXNhIikgKSAlPiUgDQogIGFycmFuZ2UoYW5pbykNCnBweWVfeXBmDQoNCnBweWVfeXBmX3Rhc2FzIDwtIHBweWVfeXBmICU+JQ0KICAgYXJyYW5nZShhbmlvKSAlPiUNCiAgZmlsdGVyKGFuaW8gJWluJSAxOTk4OjIwMTgpICU+JQ0KICBzZWxlY3QoLWMoYW5pbywgZW1wcmVzYSwgdW5pZGFkKSkgJT4lDQogIG11dGF0ZV9hbGwodGFzYV9jcmVjaW1pZW50bykNCg0KI21hdHJpeiBkZSBjb3JyZWxhY2lvbg0KY29yX3Bvem9zX3lwZiA8LSBjb3IocHB5ZV95cGZfdGFzYXMsIHVzZSA9ICJjb21wbGV0ZS5vYnMiKQ0KY29yX3Bvem9zX3lwZg0KDQojICBkaXN0aW50b3MgY29ycmVsb2dyYW1hcw0KI2NvbiBnZ2NvcnJwbG90DQpwLm1hdCA9IGNvcl9wbWF0KGNvcl9wb3pvc195cGYpDQpnZ2NvcnJwbG90KGNvcl9wb3pvc195cGYsIGhjLm9yZGVyID0gVFJVRSwNCiAgICB0eXBlID0gImxvd2VyIiwgcC5tYXQgPSBwLm1hdCwgbGFiID0gVCkNCg0KR0dhbGx5OjpnZ3BhaXJzKHBweWVfeXBmX3Rhc2FzLCBsb3dlciA9IGxpc3QoY29udGludW91cyA9ICJzbW9vdGgiKSkNCnBsb3QocHB5ZV95cGZfdGFzYXMpDQpgYGANCg0KDQpgYGB7cn0NCiNhw7FvcyBiYXNlcw0KYW5pb19iYXNlX3lwZl9zZWdtZW50byA8LSAgIHBweWVfeXBmJGFjdGl2b191cHN0cmVhbVtwcHllX3lwZiRhbmlvID09IDIwMDZdDQoNCmFuaW9fYmFzZV95cGZfYm9sc2FyIDwtIHBweWVfeXBmJHBweWVfaW50ZWdyYWRhW3BweWVfeXBmJGFuaW8gPT0gMjAwNl0NCg0KDQpzdG9ja195X3Bvem9zX3lwZiA8LSAgcHB5ZV95cGYgJT4lIA0KICBtdXRhdGUoaW5kaWNlX3Bvem9zXzA2ID0gZ2VuZXJhcl9pbmRpY2Uoc2VyaWU9IHBvem9zICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYSA9IGFuaW8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGFfYmFzZSA9IDIwMDYpKSAlPiUgDQogIG11dGF0ZShwcHllX3lwZl9lc3RpbWFkbyA9IGFuaW9fYmFzZV95cGZfYm9sc2FyICogaW5kaWNlX3Bvem9zXzA2LA0KICAgICAgICAgYWN0aXZvX3lwZl9lc3RpbWFkbyA9YW5pb19iYXNlX3lwZl9zZWdtZW50byAqIGluZGljZV9wb3pvc18wNiwNCiAgICAgICAgIHVuaWRhZF9wcHllPSJNaWxsb25lcyBkZSBwZXNvcyAyMDE4IikNCg0Kc3RvY2tfeV9wb3pvc195cGYgJT4lDQogICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQgPSB1bmlkYWRfcHB5ZSwgcHB5ZV95cGZfZXN0aW1hZG8sIGFjdGl2b195cGZfZXN0aW1hZG8pICU+JQ0KICAgICAgICAgICBnYXRoZXIoa2V5ID0gZXN0aW1hY2lvbiwNCiAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbG9yLCANCiAgICAgICAgICAgICAgICAgICAzOjQpICU+JSANCiAgICAgICAgICAgZmlsdGVyKGFuaW8gPjE5NjApICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLHZhbG9yICwgY29sb3IgPSBlc3RpbWFjaW9uKSkrDQogIGdlb21fbGluZSgpKw0KICBsYWJzKHk9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IiwgdGl0bGUgPSAiRXN0aW1hY2lvbiBkZSBBY3Rpdm8gdXNwdHJlYW0geSBQUHlFIGRlIFlQRiBhIHBhcnRpciBkZSBpbmRpY2UgZGUgcG96b3MiKQ0KYGBgDQoNCiMjIyMjIyBQUHlFIHkgYWN0aXZvIHVwc3RyZWFtIHRvdGFsIHJhbWEgYSBwYXJ0aXIgZGUgWVBGDQoNCmBgYHtyfQ0KcG96b3NfeWZwX3NvYnJlX3RvdGFsIDwtIGxpc3RhZG9fcG96b3MgJT4lDQogIHJlbmFtZShhbmlvID0gYW5pb190ZXJtaW5hY2lvbl9wb3pvKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKHBvem9zX2NhcmdhZG9zX3NlY19lbmVyZ2lhID0gc3VtKHBvem9zLCBuYS5ybSA9IFQpKSAlPiUgDQogIGxlZnRfam9pbihsaXN0YWRvX3Bvem9zICU+JQ0KICAgICAgICAgICAgICByZW5hbWUoYW5pbyA9IGFuaW9fdGVybWluYWNpb25fcG96bykgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoaWRlbXByZXNhID09ICJZUEYiKSAlPiUgDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFuaW8sIGlkZW1wcmVzYSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UocG96b3NfY2FyZ2Fkb3NfeXBmID0gc3VtKHBvem9zLCBuYS5ybSA9IFQpKSkgJT4lIA0KICBtdXRhdGUoeXBmX3NvYnJlX3RvdGFsID0gcG96b3NfY2FyZ2Fkb3NfeXBmL3Bvem9zX2NhcmdhZG9zX3NlY19lbmVyZ2lhKQ0KIyBwb3pvc195ZnBfc29icmVfdG90YWwNCg0KZXN0aW1hY2lvbl9wcHllX3RvdGFsX3ZpYV95cGYgPC0gc3RvY2tfeV9wb3pvc195cGYgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX3BweWUsIHBweWVfeXBmX2VzdGltYWRvLCBhY3Rpdm9feXBmX2VzdGltYWRvKSAlPiUgDQogIGdhdGhlcihrZXkgPSBlc3RpbWFjaW9uLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwgDQogICAgICAgICAzOjQpICU+JSANCiAgbGVmdF9qb2luKHBvem9zX3lmcF9zb2JyZV90b3RhbCAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB5cGZfc29icmVfdG90YWwpKSAlPiUgDQogIG11dGF0ZSh2YWxvciA9IHZhbG9yL3lwZl9zb2JyZV90b3RhbCwNCiAgICAgICAgICBlc3RpbWFjaW9uID0gY2FzZV93aGVuKGVzdGltYWNpb24gPT0gInBweWVfeXBmX2VzdGltYWRvIiB+ICJwcHllX2VzdGltYWRvX3RvdGFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzdGltYWNpb24gPT0gImFjdGl2b195cGZfZXN0aW1hZG8iIH4gImFjdGl2b19lc3RpbWFkb191cHN0cmVhbSIgKSkNCiAgDQplc3RpbWFjaW9uX3BweWVfdG90YWxfdmlhX3lwZiAlPiUNCiAgICAgICAgICAgZmlsdGVyKGFuaW8gPjE5NjApICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLHZhbG9yICwgY29sb3IgPSBlc3RpbWFjaW9uKSkrDQogIGdlb21fbGluZSgpKw0KICBsYWJzKHk9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IiwgDQogICAgICAgdGl0bGUgPSAiRXN0aW1hY2lvbiBkZSBBY3Rpdm8gdXNwdHJlYW0geSBQUHlFIHRvdGFsIGEgcGFydGlyIGRlIGFtcGxpYWNpw7NuIGRlIHBvem9zIFlQRiIpDQpgYGANCg0KDQoNCg0KDQoNCg0KDQoNCiMjIEludmVyc2lvbmVzDQoNCkZ1ZW50ZXM6IA0KDQoqIEJhbGFuY2VzIGRlIEJvbHNhci4gSW52ZXJzacOzbiBjYWxjdWxhZGEgYSBwYXJ0aXIgZGUgdmFyaWFjaW9uZXMgZGVsIGFjdGl2byArIGNvbnN1bW8gZGUgY2FwaXRhbCBmaWpvIChlc3RvIMO6bHRpbW8gZXN0w6EgcGVuZGllbnRlKQ0KKiBTZWNyZXRhcmlhIGRlIEVuZXJnw61hLiBSZXNvbHVjacOzbiAyMDU3IA0KICArIFtJbnZlcnNpb25lcyByZWFsaXphZGFzIGHDsW8gYW50ZXJpb3JdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9pbnZlcnNpb25lcy1lbi1tZXJjYWRvLWRlLWhpZHJvY2FyYnVyb3MtdXBzdHJlYW0vYXJjaGl2by8yODVkNDVlNS0xYjg4LTRkYWUtOGU1Yy1jMDE4NDNjN2M4YzApDQogICsgW0ludmVyc2lvbmVzIGFudWFsZXMgcHJldmlzdGFzIGEgcmVhbGl6YXIgZW4gZWwgYcOxbyBkZSBsYSBwcmVzZW50YWNpw7NuIGRlIGxhIERESkpdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9pbnZlcnNpb25lcy1lbi1tZXJjYWRvLWRlLWhpZHJvY2FyYnVyb3MtdXBzdHJlYW0pDQoNCg0KNCkgY29uc3RydWlyIHNlcmllIGRlIGludmVyc2nDs24gcGFyYSBhdHJhcyAoYnVzY2FyIFN0b2NrIGRlIFlQRiBwZXJvIHNvbG8gcGFyYSBleHRyYWNjacOzbikuIGFybWFyIGVqZXJjaWNpbyBkZSBGRCB5IHZlciBzaSBsYXMgcHJvcG9yY2lvbmVzIHNlIG1hbnRpZW5lbi4gDQoNCiogUmVjb25zdHJ1Y2Npb24gZGUgc2VyaWUgZGUgaW52ZXJzaW9uIHBvciBlbXByZXNhDQp2ZXIgdW4gZmx1am8gZGUgcG96b3MgeSB1biBmbHVqbyBkZSBpbnZlcnNpb24geSBsdWVnbyB2ZXIgc2kgbG8gcXVlIG11ZXZlIGxhIGludmVyc2lvbiBzb24gbG9zIHBvem9zIChxdWUgc3UgZXZvbHVjaW9uIHNlYSBzaW1pbGFyKS4gDQoNCi0gaW52ZXJzaW9uIHBvciBlbXByZXNhIChiYWxhbmNlOiB2YXJpYWNpb24gZGVsIGFjdGl2byArIGNvbnN1bW8gZGUgSyBmaWpvKQ0KLSBpbnZlcnNpb24gcG9yIGVtcHJlc2EgKHNlY3JldGFyaWEgZGUgZW5lcmdpYSkNCi0gaW52ZXJzaW9uIGFncmVnYWRhICh0aXBvIGRlIGludmVyc2lvbikgKGN1ZW50YXMgbmFjaW9uYWxlcz8pDQotIHBvem9zIG51ZXZvcyBwb3IgZW1wcmVzYSBwb3IgYcOxbw0KLSBwb3pvcyBudWV2b3MgdG90YWxlcw0KLSBhcGxpY2FyIE1JUCBwYXJhIFlQRiANCg0KSW52ZXJzacOzbiBhIHBhcnRpciBkZSBCYWxhbmNlcw0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KaW52ZXJzaW9uZXNfZW1wcmVzYSA8LSBzdG9ja19iYWxhbmNlc19lbXByZXNhcyAlPiUNCiAgdW5ncm91cCgpICU+JSANCiAgc2VsZWN0KC1jKGZ1ZW50ZSwgc2VjdG9yKSkgJT4lIA0KICBmaWx0ZXIodmFyaWFibGUgPT0gInBweWUiKSAlPiUNCiAgYXJyYW5nZShlbXByZXNhLCBhbmlvKSAlPiUgDQogIGdyb3VwX2J5KHVuaWRhZCwgdmFyaWFibGUsIGVtcHJlc2EpICU+JQ0KICBtdXRhdGUodmFsb3IgPSB2YXJpYWNpb25faW50ZXJhbnVhbCh2YWxvcikpDQogICANCiMgaW52ZXJzaW9uZXNfZW1wcmVzYQ0KDQpncmFmX2ludmVyc2lvbmVzX2VtcHJlc2EgPC0gaW52ZXJzaW9uZXNfZW1wcmVzYSAlPiUgDQogIGZpbHRlcihlbXByZXNhICE9ICJDYW11enppIEdhcyBQYW1wZWFuYSIpICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSBlbXByZXNhKSkrIA0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICBsYWJzKHRpdGxlID0gIkludmVyc2lvbmVzIHBvciBlbXByZXNhIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJBIHBhcnRpciBkZSBiYWxhbmNlcyIsDQogICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIsDQogICAgICAgY2FwdGlvbiA9ICJCYWxhbmNlcyBkZSBlbXByZXNhcyBleHRyYcOtZG9zIGRlIEJvbHNhciIpKw0KICBmYWNldF93cmFwKH52YXJpYWJsZSkNCiMgZ2dwbG90bHkoZ3JhZl9pbnZlcnNpb25lc19lbXByZXNhLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQ0KDQpgYGANCg0KDQpJbnZlcnNpw7NuIGEgcGFydGlyIGRlIFNlY3JldGFyaWEgZGUgRW5lcmfDrWENCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQppbnZlcnNpb25lc19hbmlvX2FudGVyaW9yIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0ludmVyc2lvbi9TZWNyZXRhcmlhIGRlIEVuZXJnaWEvcmVzb2x1Y2luLTIwNTctaW52ZXJzaW9uZXMtcmVhbGl6YWRhcy1hby1hbnRlcmlvci5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKGBGZWNoYSBGaW4gVGFyZWFzYCA9IGNvbF9kYXRlKGZvcm1hdCA9ICIlZC8lbS8lWSIpLCANCiAgICAgICAgYEZlY2hhIEluaWNpbyBUYXJlYXNgID0gY29sX2RhdGUoZm9ybWF0ID0gIiVkLyVtLyVZIikpKSAlPiUgDQogIHJlbmFtZShhbmlvID0gIkHDsW8gZGUgcHJlc2VudGFjacOzbiBkZSBsYSBEREpKIiwNCiAgICAgICAgIGVtcHJlc2EgPSAiRW1wcmVzYSBpbmZvcm1hbnRlIiwNCiAgICAgICAgIGNvbmNlcHRvID0gIkRlc2NyaXBjacOzbiBkZWwgcGxhbiBkZSBhY2Npw7NuIChDb25jZXB0b3MpIiwNCiAgICAgICAgIGNhbnRpZGFkX2V4cGxvcmFjaW9uID0gIkNhbnQuIEV4cGxvcmFjaW9uIiwNCiAgICAgICAgIGNhbnRpZGFkX2V4cGxvdGFjaW9uID0gIkNhbnQuIEV4cGxvdGFjaW9uIiwNCiAgICAgICAgIGNhbnRpZGFkX2V4cGxvcmFjaW9uX2NvbXBsZW1lbnRhcmlhID0gIkNhbnQuIEV4cGxvcmFjaW9uIENvbXBsZW1lbnRhcmlhIiwNCiAgICAgICAgIGV4cGxvcmFjaW9uX21pbGxvbmVzX3VzZCA9ICJNaWxsb25lcyB1JHMgRXhwbG9yYWNpb24iLA0KICAgICAgICAgZXhwbG90YWNpb25fbWlsbG9uZXNfdXNkID0gIk1pbGxvbmVzIHUkcyBFeHBsb3RhY2lvbiIsDQogICAgICAgICBleHBsb3JhY2lvbl9jb21wbF9taWxsb25lc191c2QgPSAiTWlsbG9uZXMgdSRzIEV4cC4gQ29tcGxlbWVudGFyaWEiKSAlPiUgDQogIG11dGF0ZShhbmlvID0gYW5pbyAtIDEsDQogICAgICAgICBlbXByZXNhID1jYXNlX3doZW4oZW1wcmVzYSA9PSAiWVBGIFMuQS4iIH4gIllQRiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiUEFOIEFNRVJJQ0FOIEVORVJHWSAoU1VDVVJTQUwgQVJHRU5USU5BKSBMTEMiIH4gIlBBRSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiUEFOIEFNRVJJQ0FOIEVORVJHWSBTTCIgfiAiUEFFIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJQRVRST0JSQVMgQVJHRU5USU5BIFMuQS4iIH4gIlBldHJvYnJhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiUEVTQSAoUEVUUk9CUkFTIEUuUy5BLikiIH4gIlBldHJvYnJhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiRU5BUCBTSVBFVFJPTCBBUkdFTlRJTkEgUy5BLiIgfiAiRU5BUCBTSVBFVFJPTCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiVklTVEEgT0lMICYgR0FTIEFSR0VOVElOQSBTQVUiIH4gIlZpc3RhIE9pbCBhbmQgR2FzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJWSVNUQSBPSUwgJiBHQVMgQVJHRU5USU5BIFNBIiB+ICJWaXN0YSBPaWwgYW5kIEdhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiU0lOT1BFQyBBUkdFTlRJTkEgRVhQTE9SQVRJT04gQU5EIFBST0RVQ1RJT04sIElOQy4iIH4gIlNpbm9wZWMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlRFQ1BFVFJPTCBTLkEuIiB+ICJUZWNwZXRyb2wiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJQTFVTUEVUUk9MIFMuQS4iIH4gIlBsdXNwZXRyb2wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBMVVNQRVRST0wgRU5FUkdZIFMuQS4iIH4gIlBsdXNwZXRyb2wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIkNPTVBBw5HDjUEgR0VORVJBTCBERSBDT01CVVNUSUJMRVMgUy5BLiIgfiAiQ0dDIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJXSU5URVJTSEFMTCBFTkVSR0lBIFMuQS4iIH4gIldpbnRlcnNoYWxsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJZU1VSIEVORVJHw41BIEFSR0VOVElOQSBTLlIuTC4iIH4gIllTVVIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIllTVVIgUEVUUk9MRVJBIEFSR0VOVElOQSBTLkEuIiB+ICJZU1VSIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJUT1RBTCBBVVNUUkFMIFMuQS4iIH4gIlRvdGFsIEF1c3RyYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBlbXByZXNhKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgZW1wcmVzYSwgaWRlbXByZXNhLCAgY29uY2VwdG8sDQogICAgICAgICBjYW50aWRhZF9leHBsb3JhY2lvbiwgY2FudGlkYWRfZXhwbG90YWNpb24sY2FudGlkYWRfZXhwbG9yYWNpb25fY29tcGxlbWVudGFyaWEsDQogICAgICAgICBleHBsb3JhY2lvbl9taWxsb25lc191c2QsZXhwbG90YWNpb25fbWlsbG9uZXNfdXNkLCBleHBsb3JhY2lvbl9jb21wbF9taWxsb25lc191c2QgKSAlPiUgDQogICMgZmlsdGVyKHN0cl9kZXRlY3QoY29uY2VwdG8sICdwb3pvJykpICU+JQ0KICBncm91cF9ieShlbXByZXNhLCBhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShpbnZlcnNpb25fZXhwbG90YWNpb24gPSBzdW0oZXhwbG90YWNpb25fbWlsbG9uZXNfdXNkLCBuYS5ybSA9IFQpKSAlPiUgDQogIGFycmFuZ2UoLWludmVyc2lvbl9leHBsb3RhY2lvbikgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIk1pbGxvbmVzIGRlIFVTRCIpDQppbnZlcnNpb25lc19hbmlvX2FudGVyaW9yDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcmVzb2x1Y2luXzIwNTdfaW52ZXJzaW9uZXNfcmVhbGl6YWRhc19tZW5zdWFsIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0ludmVyc2lvbi9TZWNyZXRhcmlhIGRlIEVuZXJnaWEvcmVzb2x1Y2luLTIwNTctaW52ZXJzaW9uZXMtcmVhbGl6YWRhcy1tZW5zdWFsLmNzdiIpDQoNCnJlc29sdWNpbl8yMDU3X2ludmVyc2lvbmVzX2Zpbl9jb25jZXNpb248LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9JbnZlcnNpb24vU2VjcmV0YXJpYSBkZSBFbmVyZ2lhL3Jlc29sdWNpbi0yMDU3LWludmVyc2lvbmVzLXJlYWxpemFkYXMtZmluLWRlLWNvbmNlc2luLmNzdiIpDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KaW52ZXJzaW9uZXNfMjAwNV8yMDEyIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvSW52ZXJzaW9uL1NlY3JldGFyaWEgZGUgRW5lcmdpYS90YWJsYXMgZGluYW1pY2FzL2ludmVyc2lvbmVzXzIwMDVfMjAxMi54bHN4IiwgDQogICAgY29sX3R5cGVzID0gYygibnVtZXJpYyIsICJ0ZXh0IiwgInRleHQiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiksIA0KICAgIHNraXAgPSA4KSAlPiUgDQogIHJlbmFtZShwbGFuXzFyYV9zZW1hbmEgPSAiUGxhbiAxwqogU2VtLiIsDQogICAgICAgICBwbGFuX2FudWFsID0gIlBsYW4gQW51YWwiLA0KICAgICAgICAgcmVhbGl6YWRvX2FudWFsID0gIlJlYWxpemFkbyBBbnVhbCIsDQogICAgICAgICBjb25jZXB0byA9IENvbmNlcHRvKSAlPiUgDQogIG11dGF0ZShhbmlvID0gIHpvbzo6bmEubG9jZihhbmlvKSwNCiAgICAgICAgIGVtcHJlc2EgPSAgem9vOjpuYS5sb2NmKGVtcHJlc2EpLA0KICAgICAgICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIFVTRCIsDQogICAgICAgICBlbXByZXNhID1jYXNlX3doZW4oZW1wcmVzYSA9PSAiWVBGIFMuQS4iIH4gIllQRiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiUEFOIEFNRVJJQ0FOIEVORVJHWSAoU1VDVVJTQUwgQVJHRU5USU5BKSBMTEMiIH4gIlBBRSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiUEFOIEFNRVJJQ0FOIEVORVJHWSBTTCIgfiAiUEFFIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJQRVRST0JSQVMgQVJHRU5USU5BIFMuQS4iIH4gIlBldHJvYnJhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiUEVTQSAoUEVUUk9CUkFTIEUuUy5BLikiIH4gIlBldHJvYnJhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiRU5BUCBTSVBFVFJPTCBBUkdFTlRJTkEgUy5BLiIgfiAiRU5BUCBTSVBFVFJPTCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiVklTVEEgT0lMICYgR0FTIEFSR0VOVElOQSBTQVUiIH4gIlZpc3RhIE9pbCBhbmQgR2FzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJWSVNUQSBPSUwgJiBHQVMgQVJHRU5USU5BIFNBIiB+ICJWaXN0YSBPaWwgYW5kIEdhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiU0lOT1BFQyBBUkdFTlRJTkEgRVhQTE9SQVRJT04gQU5EIFBST0RVQ1RJT04sIElOQy4iIH4gIlNpbm9wZWMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlRFQ1BFVFJPTCBTLkEuIiB+ICJUZWNwZXRyb2wiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJQTFVTUEVUUk9MIFMuQS4iIH4gIlBsdXNwZXRyb2wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBMVVNQRVRST0wgRU5FUkdZIFMuQS4iIH4gIlBsdXNwZXRyb2wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIkNPTVBBw5HDjUEgR0VORVJBTCBERSBDT01CVVNUSUJMRVMgUy5BLiIgfiAiQ0dDIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJXSU5URVJTSEFMTCBFTkVSR0lBIFMuQS4iIH4gIldpbnRlcnNoYWxsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJZU1VSIEVORVJHw41BIEFSR0VOVElOQSBTLlIuTC4iIH4gIllTVVIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIllTVVIgUEVUUk9MRVJBIEFSR0VOVElOQSBTLkEuIiB+ICJZU1VSIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJUT1RBTCBBVVNUUkFMIFMuQS4iIH4gIlRvdGFsIEF1c3RyYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBlbXByZXNhKSkgJT4lIA0KICBmaWx0ZXIoIShlbXByZXNhICVpbiUgYygiTyZHIERFVkVMT1BNRU5UUyBMVEQgUy5BLiIgLCJQRVRST01JTkVSQSBDSFVCVVQgUy5FLiIpKSkgJT4lDQogICMgZmlsdGVyKHN0cl9kZXRlY3QoY29uY2VwdG8sICdwb3pvJykpICU+JQ0KICBncm91cF9ieShlbXByZXNhLCBhbmlvLCB1bmlkYWQpICU+JSANCiAgc3VtbWFyaXNlKGludmVyc2lvbl9hbnVhbCA9IHN1bShyZWFsaXphZG9fYW51YWwsIG5hLnJtID0gVCkpICU+JSANCiAgYXJyYW5nZSgtaW52ZXJzaW9uX2FudWFsKQ0KaW52ZXJzaW9uZXNfMjAwNV8yMDEyDQoNCg0KDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KZ3JhZl9pbnZlcnNpb25lc18yMDA1XzIwMTIgPC0gIGludmVyc2lvbmVzXzIwMDVfMjAxMiAlPiUNCiAgZ2dwbG90KGFlcyhhbmlvLCBpbnZlcnNpb25fYW51YWwsIGNvbG9yID0gZW1wcmVzYSkpKyANCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgbGFicyh0aXRsZSA9ICJJbnZlcnNpb25lcyBwb3IgZW1wcmVzYSAodGFibGFzIGRpbmFtaWNhcykiLA0KICAgICAgIHN1YnRpdGxlID0gIkV4dHJhw61kbyBkZSB0YWJsYXMgZGluw6FtaWNhcyIsDQogICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgVVNEIiwNCiAgICAgICBjYXB0aW9uID0gIlNlY3JldGFyaWEgZGUgRW5lcmfDrWEiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KZ2dwbG90bHkoZ3JhZl9pbnZlcnNpb25lc18yMDA1XzIwMTIsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA2MDApDQoNCmdyYWZfaW52ZXJzaW9uZXNfYW5pb19hbnRlcmlvciA8LSAgaW52ZXJzaW9uZXNfYW5pb19hbnRlcmlvciAlPiUNCiAgZ2dwbG90KGFlcyhhbmlvLCBpbnZlcnNpb25fZXhwbG90YWNpb24sIGNvbG9yID0gZW1wcmVzYSkpKyANCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgbGFicyh0aXRsZSA9ICJJbnZlcnNpb25lcyBwb3IgZW1wcmVzYSAoYcOxbyBhbnRlcmlvcikiLA0KICAgICAgIHN1YnRpdGxlID0gIkludmVyc2lvbmVzIGHDsW8gYW50ZXJpb3IiLA0KICAgICAgICB5ID0gIk1pbGxvbmVzIGRlIFVTRCIsDQogICAgICAgY2FwdGlvbiA9ICJTZWNyZXRhcmlhIGRlIEVuZXJnw61hIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCmdncGxvdGx5KGdyYWZfaW52ZXJzaW9uZXNfYW5pb19hbnRlcmlvciwgd2lkdGggPSA3MDAsIGhlaWdodCA9IDQ1MCkNCg0KYGBgDQoNCg0KIyMjIEFuw6FsaXNpcyBkZSBjb3JyZWxhY2nDs24gZW50cmUgSW52ZXJzacOzbiB5IFBvem9zDQoNCi0gYnVzY2FyIGNvcnJlbGFjaW9uLCBwYXJhIHZlciBzaSBsYSBzZXJpZSBkZSBpbnZlcnNpw7NuIHNlIG11ZXZlIHNpbWlsYXIgYSBsb3MgcG96b3MNCi0gdXNhciBzdG9jayB5IGFkZW1hcyB1c2FyIHZhcmlhY2lvbiBkZSBzdG9jayAoYnMgZGUgdXNvKQ0KDQpDb24gcG96b3MgZGUgSUFQRw0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgY29uIGludmVyc2lvbmVzIHJlYWxpemFkYXMgYcOxbyBhbnRlcmlvcg0KaW52ZXJzaW9uX3Bvem9zIDwtIHBvem9zX2lhcGcgJT4lIA0KICBsZWZ0X2pvaW4oaW52ZXJzaW9uZXNfYW5pb19hbnRlcmlvciAlPiUNCiAgICAgICAgICAgICAgdW5ncm91cCgpLCBieSA9IGMoImVtcHJlc2EiLCAiYW5pbyIpKSAlPiUgDQogIG11dGF0ZShpbnZlcnNpb25fcG9yX3Bvem8gPSBpbnZlcnNpb25fZXhwbG90YWNpb24gL3RvdGFsX3Bvem9zKQ0KDQojY29uIGludmVyc2lvbmVzIGFudW5jaWFkYXMNCmludmVyc2lvbl9wb3pvc18yIDwtIHBvem9zX2lhcGcgJT4lIA0KICBsZWZ0X2pvaW4oaW52ZXJzaW9uZXNfMjAwNV8yMDEyICU+JQ0KICAgICAgICAgICAgICB1bmdyb3VwKCksIGJ5ID0gYygiZW1wcmVzYSIsICJhbmlvIikpICU+JSANCiAgbXV0YXRlKGludmVyc2lvbl9wb3JfcG96byA9IGludmVyc2lvbl9hbnVhbCAvdG90YWxfcG96b3MpDQoNCiNlc3RhIG1hbCBwcSBlcyBmbHVqbyBkZSBwb3pvcyB2cyBzdG9jayBkZSBjYXBpdGFsDQojIGt0YV9wb3pvcyA8LSBwb3pvc19pYXBnICU+JSANCiMgICBsZWZ0X2pvaW4oc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMgJT4lDQojICAgICAgICAgICAgICAgdW5ncm91cCgpICU+JSANCiMgICAgICAgICAgICAgICBzZWxlY3QoLXNlY3RvciksIGJ5ID0gYygiZW1wcmVzYSIsICJhbmlvIikpICU+JSANCiMgICBtdXRhdGUocHB5ZV9wb3JfcG96byA9IHByb3BfcGxhbnRfZXF1aXAgL3RvdGFsX3Bvem9zKQ0KDQoNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpncmFmX2ludmVyc2lvbl9wb3pvIDwtIGludmVyc2lvbl9wb3pvcyAlPiUgDQogIGZpbHRlciggYW5pbyA+PSAyMDEyKSAlPiUNCiAgZ2dwbG90KGFlcyhhbmlvLGludmVyc2lvbl9wb3JfcG96bywgY29sb3IgPSBlbXByZXNhICkpKw0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICBsYWJzKHRpdGxlID0gIkludmVyc2lvbmVzIGHDsW8gYW50ZXJpb3Igc29icmUgcG96b3MgSUFQRyIsIA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgVVNEIikrDQogIHRoZW1lX2NsYXNzaWMoKQ0KZ2dwbG90bHkoZ3JhZl9pbnZlcnNpb25fcG96bywgd2lkdGggPSA4MDAsIGhlaWdodCA9IDYwMCkNCg0KZ3JhZl9pbnZlcnNpb25fcG96b18yIDwtIGludmVyc2lvbl9wb3pvc18yICU+JSANCiAgZmlsdGVyKCBhbmlvIDw9IDIwMTIpICU+JQ0KICBnZ3Bsb3QoYWVzKGFuaW8saW52ZXJzaW9uX3Bvcl9wb3pvLCBjb2xvciA9IGVtcHJlc2EgKSkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIGxhYnModGl0bGUgPSAiSW52ZXJzaW9uZXMgcmVhbGl6YWRhcyBzb2JyZSBwb3pvcyBJQVBHIiwgDQogICAgICAgeSA9ICJNaWxsb25lcyBkZSBVU0QiKSsNCiAgdGhlbWVfY2xhc3NpYygpDQpnZ3Bsb3RseShncmFmX2ludmVyc2lvbl9wb3pvXzIsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA0MDApDQpgYGANCg0KQ29uIHBvem9zIENhcCBJVg0KYGBge3IgZWNobz1GQUxTRX0NCiMgY29uIGludmVyc2lvbmVzIHJlYWxpemFkYXMgYcOxbyBhbnRlcmlvcg0KaW52ZXJzaW9uX3Bvem9zX2NhcGl2IDwtIGxpc3RhZG9fcG96b3MgJT4lDQogIHJlbmFtZShhbmlvID1hbmlvX3Rlcm1pbmFjaW9uX3Bvem8pICU+JSANCiAgbGVmdF9qb2luKGludmVyc2lvbmVzX2FuaW9fYW50ZXJpb3IgJT4lDQogICAgICAgICAgICAgIHVuZ3JvdXAoKSwgYnkgPSBjKCJlbXByZXNhIiwgImFuaW8iICkpICU+JQ0KICBtdXRhdGUoaW52ZXJzaW9uX3Bvcl9wb3pvID0gaW52ZXJzaW9uX2V4cGxvdGFjaW9uIC9wb3pvcykNCg0KZ3JhZl9pbnZlcnNpb25fcG96byA8LSBpbnZlcnNpb25fcG96b3NfY2FwaXYgJT4lIA0KICBmaWx0ZXIoIGFuaW8gPj0gMjAxMikgJT4lDQogIGdncGxvdChhZXMoYW5pbyxpbnZlcnNpb25fcG9yX3Bvem8sIGNvbG9yID0gZW1wcmVzYSApKSsNCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgbGFicyh0aXRsZSA9ICJJbnZlcnNpb25lcyBhw7FvIGFudGVyaW9yIHNvYnJlIHBvem9zIENhcGl0dWxvIElWIiwgDQogICAgICAgeSA9ICJNaWxsb25lcyBkZSBVU0QiKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpnZ3Bsb3RseShncmFmX2ludmVyc2lvbl9wb3pvLCB3aWR0aCA9IDcwMCwgaGVpZ2h0ID0gNDAwKQ0KDQoNCmBgYA0KDQojIyBSZWdhbMOtYXMNCg0KKiBGdWVudGVzOiANCiAgKyBTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSAoQmFzZSBSZWdhbMOtYXMpDQoNCg0KUkVWSVNBUiBFTCBDQUxDVUxPIERFIEJFVEFOSUEgDQpjdWFudG8gZ2FuYXJpYW4gbGFzIHByb3ZpbmNpYXMgc2kgZWwgcHJlY2lvIGRlbCBtZXJjYWRvIGludGVybm8gc2UgYWNvbW9kYSBhbCBpbnRlcm5hY2lvbmFsPw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI3JlZ2FsaWFzDQojZmlsdHJvIGNvbiBwcm9kdWN0b3MNCnByb2R1Y3RvcyA8LSBsaXN0KCJjcnVkbyIsICJnYXMiLCAiZ2Fzb2xpbmEiLCAiZ2xwIikNCg0KI2xvb3AgcGFyYSBsZXZhbnRhciBsYXMgYmFzZXMNCmxpc3RhX3JlZ2FsaWFzID0gbGlzdCgpDQpmb3IoaSBpbiBwcm9kdWN0b3Mpew0KICByZWdhbGlhc19pIDwtIHJlYWRfZGVsaW0ocGFzdGUwKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL2RhdGFzZXRzL3JlZ2FsaWFzXyIsIGksICIuY3N2IiksIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSwgDQogICAgc2tpcCA9IDEpDQogIGxpc3RhX3JlZ2FsaWFzW1tpXV0gPC0gcmVnYWxpYXNfaQ0KfQ0KDQojYmFzZXMgaW5kaXZpZHVhbGVzDQpyZWdhbGlhc19jcnVkbyA8LSBsaXN0YV9yZWdhbGlhcyRjcnVkbyAlPiUgDQogIG11dGF0ZShtb25lZGEgPSAiVVNEIiwNCiAgICAgICAgIHByb2R1Y3RvID0gImNydWRvIikNCnJlZ2FsaWFzX2dhcyA8LSBsaXN0YV9yZWdhbGlhcyRnYXMgJT4lIA0KICBtdXRhdGUobW9uZWRhID0gImFycyIsDQogICAgICAgICBwcm9kdWN0byA9ICJnYXMiKQ0KcmVnYWxpYXNfZ2Fzb2xpbmEgPC0gbGlzdGFfcmVnYWxpYXMkZ2Fzb2xpbmEgJT4lIA0KICBtdXRhdGUobW9uZWRhID0gIlVTRCIsDQogICAgICAgICBwcm9kdWN0byA9ICJnYXNvbGluYSIpDQpyZWdhbGlhc19nbHAgPC0gbGlzdGFfcmVnYWxpYXMkZ2xwICU+JSANCiAgbXV0YXRlKG1vbmVkYSA9ICJhcnMiLA0KICAgICAgICAgcHJvZHVjdG8gPSAiZ2xwIikNCg0KI2Jhc2UgY29tcGxldGENCnJlZ2FsaWFzIDwtICByZWdhbGlhc19jcnVkbyAlPiUgDQogIGJpbmRfcm93cyhyZWdhbGlhc19nYXMsIHJlZ2FsaWFzX2dhc29saW5hLCByZWdhbGlhc19nbHApICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiQcORTyIsDQogICAgICAgICBtZXMgPSAiTUVTIiwgDQogICAgICAgICByZWdhbGlhc190b3RhbCA9ICJUT1RBTCBQUk9WSU5DSUEiKSAlPiUgDQogIG11dGF0ZShmZWNoYSA9IGFzLkRhdGUocGFyc2VfZGF0ZV90aW1lKHBhc3RlMChhbmlvLCBtZXMpLCBvcmRlcnMgPSAieW0iKSkpICU+JSANCiAgc2VsZWN0KGZlY2hhLCBhbmlvLCBtZXMsIHByb2R1Y3RvLCBtb25lZGEsIHJlZ2FsaWFzX3RvdGFsLCBldmVyeXRoaW5nKC4pKSAlPiUgDQogIGdyb3VwX2J5KHByb2R1Y3RvLCBhbmlvLCBtb25lZGEgKSAlPiUgDQogIHN1bW1hcmlzZShyZWdhbGlhc190b3RhbCA9IHN1bShyZWdhbGlhc190b3RhbCkpICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbCAlPiUgc2VsZWN0KC1UQ1ApKSAlPiUgDQogIG11dGF0ZShyZWdhbGlhc190b3RhbCA9IGNhc2Vfd2hlbihtb25lZGEgPT0gIlVTRCIgfiByZWdhbGlhc190b3RhbCAqIFRDQywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiByZWdhbGlhc190b3RhbCksDQogICAgICAgICB1bmlkYWQgPSAiYXJzIikgJT4lIA0KICBzZWxlY3QoLWMoVENDLCBtb25lZGEpKQ0KDQpyZWdhbGlhcw0KDQpyZWdhbGlhc191c2QgPC0gcmVnYWxpYXMgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsX2IgJT4lIHNlbGVjdChhbmlvLCB0Y2MpKSAlPiUgDQogIG11dGF0ZShyZWdhbGlhcyA9IHJlZ2FsaWFzX3RvdGFsIC90Y2MsIA0KICAgICAgICAgdW5pZGFkID0gIlVTRCIpICU+JSANCiAgc2VsZWN0KC1jKHJlZ2FsaWFzX3RvdGFsLCB0Y2MpKQ0KDQpgYGANCg0KIyMgU3Vic2lkaW9zDQpgYGB7cn0NCiMgQ0VGSVAgY29udCBldCBhbC4gU3Vic2lkaW9zIGNvbW8gJSBkZWwgUEJJDQpzdWJzaWRpb3NfY2VmaXAgPC0gcmVhZF9leGNlbCgiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3Mvc3Vic2lkaW9zL3N1YnNpZGlvcy54bHN4IikgJT4lIA0KICBnYXRoZXIoa2V5ID0gYW5pbywNCiAgICAgICAgIHZhbHVlID0gc3Vic2lkaW9zX3BvcmNlbnRhamVfcGJpLA0KICAgICAgICAgMjpuY29sKC4pKSAlPiUgDQogIGZpbHRlcihzZWN0b3IgJWluJSBjKCJDQU1NRVNBIiwgIlBsYW4gR2FzIiwiRU5BUlNBIiwgIlN1YnNpZGlvcyBGRiBHTiB5IEdMUCIpKSAlPiUgDQogIG11dGF0ZShhbmlvID0gYXMuZG91YmxlKGFuaW8pKSAlPiUgDQogIGxlZnRfam9pbihnYW5hbmNpYV95X3BiaSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBwYmkpKSAlPiUNCiAgbXV0YXRlKHN1YnNpZGlvc19wb3JjZW50YWplX3BiaT1hcy5kb3VibGUoc3Vic2lkaW9zX3BvcmNlbnRhamVfcGJpKSwNCiAgICAgICAgIHN1YnNpZGlvc19jZWZpcCA9IHN1YnNpZGlvc19wb3JjZW50YWplX3BiaSAqIHBiaSAqIDEwXjYpICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UodW5pZGFkID0gIlBlc29zIGNvcnJpZW50ZXMiLA0KICAgICAgICAgICAgc3Vic2lkaW9zX2NlZmlwPXN1bShzdWJzaWRpb3NfY2VmaXAsIG5hLnJtID0gVCkpDQoNCiNlamVzIA0Kc3Vic2lkaW9zX2VqZXMgPC0gcmVhZF9leGNlbCgiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvc3Vic2lkaW9zLnhsc3giICkgJT4lIA0KICByZW5hbWUoc3Vic2lkaW9zX3VzZCA9IHN1YnNpZGlvc19oaWRyb2NhcmJ1cm9zKSAlPiUgDQogIHJpZ2h0X2pvaW4odGNwX2FudWFsX2IgJT4lIA0KICAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHRjYyksIGJ5ID0gImFuaW8iKSAlPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UodW5pZGFkID0gIlBlc29zIGNvcnJpZW50ZXMiLA0KICAgICAgICAgc3Vic2lkaW9zX2VqZXMgPSBzdWJzaWRpb3NfdXNkKnRjYyoxMF42KQ0KDQpzdWJzaWRpb3NfaGlkcm9jYXJidXJvcyA8LSBzdWJzaWRpb3NfZWplcyU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgc3Vic2lkaW9zX2VqZXMpICU+JSANCiAgZnVsbF9qb2luKHN1YnNpZGlvc19jZWZpcCwgYnkgPWMoImFuaW8iLCAidW5pZGFkIikpICU+JSANCiAgYXJyYW5nZSgtYW5pbykgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIlBlc29zIGNvcnJpZW50ZXMiKQ0KICAgICAgICAgIyB4ID0gc3Vic2lkaW9zX2NlZmlwL3N1YnNpZGlvc19lamVzKQ0Kc3Vic2lkaW9zX2hpZHJvY2FyYnVyb3MgIA0KYGBgDQoNCg0KDQojIFZhbG9yIHRvdGFsIGRlIGxhIHByb2R1Y2Npw7NuICANCg0KDQojIyBDcml0ZXJpb3MgbWV0b2RvbMOzZ2ljb3MgDQpTZSBwcmVzZW50YW4gYSBjb250aW51YWNpw7NuIGRpc3RpbnRhcyBlc3RpbWFjaW9uZXMgc29icmUgbGEgbWFnbml0dWQgZGUgcmlxdWV6YSBwcmVzZW50ZSBlbiBlbCBzZWN0b3IgaGlkcm9jYXJidXLDrWZlcm86IFZhbG9yIEJydXRvIHkgQWdyZWdhZG8gZGUgUHJvZHVjY2nDs24gKFZCUCB5IFZBKSwgQ29uc3VtbyBJbnRlcmVtZWRpbyAoQ0kpLCBNYXNhIFNhbGFyaWFsIChNUykgeSBFeGNlZGVudGUgQnJ1dG8gZGUgRXhwbG90YWNpw7NuIChFQkUpLiBFbCBWQlAgc3VyZ2UgZGUgbGEgdmFsdWFjacOzbiBkZSBsYSBwcm9kdWNjacOzbiBhIHN1cyBwcmVjaW9zIGNvcnJlc3BvbmRpZW50ZXMuIEVsIFZBIHJlc3VsdGEgZGUgbGEgZGlmZXJlbmNpYSBlbnRyZSBlbCBWQlAgeSBDSSwgZWwgY3VhbCBwdWVkZSBzdXJnaXIgb3JpZ2luYWxtZW50ZSBkZSBlc3RhIHJlc3RhIG8gYSBwYXJ0aXIgZGVsIGNvZWZpY2llbnRlIHTDqWNuaWNvIGRlIGxhIE1hdHJpeiBJbnN1bW8gUHJvZHVjdG8gKE1JUCkuIEVsIEVCRSBjb25zdGl0dXllIGxhIHBsdXN2YWzDrWEgKFBWKSB0b3RhbCBkZSBsYSByYW1hLCBlcyBkZWNpciwgbGEgc3VtYSBkZSBsYSByZW50YSBkZSBsYSB0aWVycmEgKFJUKSBtw6FzIGxhIGdhbmFuY2lhIG5vcm1hbCAoR25vcm0pLCB5IHNlIG9idGllbmUgbHVlZ28gZGUgZGVzY29udGFyIGxhIE1TIHkgbG9zIGltcHVlc3RvcyBlc3BlY8OtZmljb3MgKEltcCkgZGVsIFZBLiBFbiB0b2RvcyBsb3MgY2Fzb3MgcXVlIHNlIHByZXNlbnRhcsOhbiBhIGNvbnRpbnVhY2nDs24sIGxvcyBJbXAgc2UgY2FsY3VsYXJvbiBhIHBhcnRpciBkZSBhcGxpY2FyIHNvYnJlIGVsIFZCUCB1biBjb2VmaWNpZW50ZSAgcmVzdWx0YW50ZSBkZWwgcGVzbyBkZSBsb3MgaW1wdWVzdG9zIHByb21lZGlvIGRlIGxhICBNSVAgZGUgMTk5Ny4gTG8gbWlzbW8gcGFzYSBjb24gbGEgZXN0aW1hY2nDs24gZGUgbGEgZGVwcmVjaWFjacOzbiBkZSBjYXBpdGFsIG8gY29uc3VtbyBkZSBjYXBpdGFsIGZpam8gKENvbnNLZmlqbyksIHF1ZSBzZSBvYnRpZW5lIGEgcGFydGlyIGRlIGFwbGljYXIgbGEgdGFzYSBkZSBkZXByZWNpYWNpw7NuIHByb21lZGlvIHJlc3VsdGFudGUgZGUgbG9zIGJhbGFuY2VzIGRlIFlQRiAoMTk5OCAtIDIwMTgpIHNvYnJlIGVsIHRvdGFsIGRlIFByb3BpZWRhZCwgUGxhbnRhIHkgRXF1aXBvIChQUHlFKSBkZSBsYSByYW1hLiBFc3RhIHBhcnRpZGEgc2UgYXBsaWNhIHBhcmEgb2J0ZW5lciBlbCBFeGNlZGVudGUgTmV0byBkZSBFeHBsb3RhY2nDs24uIFNlIHByZXNlbnRhbiBkaXN0aW50YXMgZXN0aW1hY2lvbmVzIHBhcmEgZWwgVkJQLCBDSSB5IE1TLCBxdWUgbHVlZ28gc2Ugb2JzZXJ2YXLDoW4gZW4gbGEgZm9ybXVsYWNpw7NuIG1hdGVtw6F0aWNhOg0KDQoNCg0KKiBDQ05OICgqY2Nubl9vZmljaWFsKikNCiAgKyBWYWxvcmVzIGNvbnRhYmxlcyBvZmljaWFsZXMgZGUgbGFzIEN1ZW50YXMgTmFjaW9uYWxlcyAoc8OzbG8gZGlzcG9uaWJsZSBwYXJhIGVsIHBlcsOtb2RvIDIwMDQtMjAxMikuIERhZG8gcXVlIHNlIHByZXNlbnRhbiBzZXJpZXMgZGUgVkJQIHkgVkEsIHNlIHB1ZG8gZXN0aW1hciBlbCBDSSBjb21vIGxhIGRpZmVyZW5jaWEgZGUgZGljaGFzIGN1ZW50YXMuIFNlIHByb2NlZGnDsyBhIHNlcGFyYXIgZWwgVkJQIGEgcGFydGlyIGRlbCBwZXNvIGRlbCBWQlAgZGUgbG9zIHNlcnZpY2lvcyBkZSBhcG95byBhIGxhIGV4dHJhY2Npw7NuIHNvYnJlIGVsIFZCUCBkZSBleHRyYWNjacOzbiBkZSBwZXRyw7NsZW8geSBnYXMsIHByZXNlbnRlIGVuIGVsIEN1YWRybyBkZSBVdGlsaXphY2nDs24gZGUgT2ZlcnRhIChDT1UpIGRlIDIwMDQgZGUgSU5ERUMuIFNlIGRlc2NvbnTDsyBlc3RhIHByb3BvcmNpw7NuIChyZXN1bHRhbnRlIGRlbCAxMCw3JSkgZGVsIFZCUCB0b3RhbCBwYXJhIG9idGVuZXIgdW4gVkJQIHPDs2xvIGRlIGV4dHJhY2Npw7NuLiBEYWRvIHF1ZSBzZSBwb3NlZSBpbmZvcm1hY2nDs24gZGVsIHNhbGFyaW8gcHJvbWVkaW8gZGVsIHNlY3RvciB5IGVsIGVtcGxlbywgc2UgcHVkbyBvYnRlbmVyIGxhIE1TIHJlc3VsdGFudGUsIHRhbnRvIHBhcmEgZWwgdG90YWwgZGVsIHNlY3RvciAoZXh0cmFjY2nDs24geSBzZXJ2aWNpb3MgcmVsYWNpb25hZG9zKSBjb21vIHBhcmEgc8OzbG8gZXh0cmFjY2nDs24uIEEgcGFydGlyIGRlIGVzdG9zIGRhdG9zIHNlIGVsYWJvcsOzIHVuIGNvZWZpY2llbnRlIHF1ZSByZWZsZWphIGVsIHByb21lZGlvIGRlIGxhIHByb3BvcmNpw7NuIGRlIGxhIE1TIHNvYnJlIGVsIFZCUCBxdWUgc2UgdXRpbGl6YXLDoSBlbiBjw6FsY3Vsb3MgcG9zdGVyaW9yZXMgZGUgTVMgdG90YWwgeSBNUyBkZSBleHRyYWNjacOzbi4gDQoNCiogRXN0aW1hY2nDs24gcHJvcGlhIGNvbiBjcml0ZXJpbyBDQ05OICgqdmJwX3ZhX2NpX3Byb3BpYSopDQogICsgRXN0aW1hY2nDs24gcHJvcGlhIGRlIGxvcyB2YWxvcmVzIGNvbnRhYmxlcyBhIHBhcnRpciBkZSBsYXMgZnVlbnRlcyByZWNvcGlsYWRhcywgc2lndWllbmRvIGxvcyBjcml0ZXJpb3MgZGUgbGFzIEN1ZW50YXMgTmFjaW9uYWxlcy4gRXMgZGVjaXIsIHBhcmEgb2J0ZW5lciBlbCBWQlAgc2UgdmFsdWEgbGEgcHJvZHVjY2nDs24gZGVzdGluYWRhIGFsIG1lcmNhZG8gaW50ZXJubyAocmVzdWx0YW50ZSBhIHBhcnRpciBkZSBsYSBkaWZlcmVuY2lhIGVudHJlIHByb2R1Y2Npw7NuIHkgZXhwb3J0YWNpb25lcykgY29uIGxvcyBwcmVjaW9zIGludGVybm9zIHkgbGFzIGV4cG9ydGFjaW9uZXMgY29uIGxvcyBwcmVjaW9zIGRlIGV4cG9ydGFjacOzbiwgdmFsdWFkb3MgdGlwbyBkZSBjYW1iaW8gY29tZXJjaWFsIChUQ0MpLiBTZSBwcm9jZWRpw7MgdGFtYmnDqW4gYSBzZXBhcmFyIGVsIFZCUCBkZSBleHRyYWNjacOzbiBuZXRvIGRlIGxvcyBzZXJ2aWNpb3MgdGFsIGNvbW8gc2UgZXhwbGljw7MgYW50ZXJpb3JtZW50ZS4gRWwgQ0kgc2UgZXN0aW3DsyBhIHBhcnRpciBkZSBhcGxpY2FyIGVsIGNvZWZpY2llbnRlIHTDqWNuaWNvIChyYXRpbyBDSS9WQlApIHJlc3VsdGFudGUgZGUgbGEgTUlQIGRlIDE5OTcgKGVxdWl2YWxlbnRlIGEgMC4yNzIpLiBEZSBpZ3VhbCBtYW5lcmEsIHBhcmEgY2FsY3VsYXIgbGEgbWFzYSBzYWxhcmlhbCBzZSBhcGxpY8OzIGVsIGNvZWZpY2llbnRlIGRlIE1TIG1lbmNpb25hZG8gYW50ZXJpb3JtZW50ZS4gRmluYWxtZW50ZSwgY29tbyBzZSBtZW5jaW9uw7MgYW50ZXJpb3JtZW50ZSwgZWwgVkEgZWwgRUJFIHNlIGNhbGN1bGFyb24gYSBwYXJ0aXIgZGUgbGFzIGRpZmVyZW5jaWFzIG1lbmNpb25hZGFzIGFudGVyaW9ybWVudGUuIA0KDQoqIEVtcGFsbWUgQ0NOTiAoKnZicF9jY25uKikNCiAgKyBFc3RpbWFjacOzbiBxdWUgdG9tYSBsb3MgdmFsb3JlcyBvZmljaWFsZXMgZGUgbGFzIGN1ZW50YXMgbmFjaW9uYWxlcyBwYXJhIGVsIHBlcsOtb2RvIGRvbmRlIHNlIHByZXNlbnRhbiBkYXRvcyAoMjAwNCAtMjAxMikgeSBxdWUgaW1wdXRhIGxvcyB2YWxvcmVzIGZhbHRhbnRlcyBwb3IgbWVkaW8gZGUgbGEgZXZvbHVjacOzbiBkZWwgw61uZGljZSBkZWwgVkJQIHByb3BpbyBjb24gY3JpdGVyaW8gQ0NOTiBleHBsaWNhZG8gYW50ZXJpb3JtZW50ZS4gQXNpbWlzbW8sIHNlIHV0aWxpemFyb24gbG9zIHZhbG9yZXMgb2ZpY2lhbGVzIGRlIGxhIE1TIGN1YW5kbyBzZSBlbmNvbnRyYWJhIGRpc3BvbmlibGUgZWwgZGF0byAoMTk5Ni0yMDE4KSwgbWllbnRyYXMgcXVlIHNlIHV0aWxpesOzIGVsIHZhbG9yIHByb3BpbyBlc3RpbWFkbyBjb24gY3JpdGVyaW8gZGUgbGFzIENDTk4gcGFyYSBsb3MgcmVzdGFudGVzIGHDsW9zLiANCiAgDQoqIENyaXRlcmlvIFByb3BpbyAoKnB2X2hpZHJvY2FyYnVyb3NfcHJvcGlhKikNCiAgKyBFc3RpbWFjacOzbiBwcm9waWEgcXVlIHJlZmxlamEgY29uIG1heW9yIHByZWNpc2nDs24gZWwgdmFsb3IgZGUgbGEgcmlxdWV6YSB0b3RhbCBwcmVzZW50ZSBlbiBlbCBzZWN0b3IuIEVsIFZCUCBzZSBvYnRpZW5lIGEgcGFyaXRyIGRlIHZhbHVhciBsYSB0b3RhbGlkYWQgZGUgbGEgcHJvZHVjY2nDs24gYSBsb3MgcHJlY2lvcyBleHRlcm5vcyBvIGRlIHJlZmVyZW5jaWEgaW50ZXJuYWNpb25hbCB5IGNvbiBlbCB0aXBvIGRlIGNhbWJpbyBkZSBwYXJpZGFkIChUQ1ApLCBxdWUgbWlkZSBsYSBjYXBhY2lkYWQgcmVhbCBkZSBjb21wcmEgZGUgbGEgbW9uZWRhIG5hY2lvbmFsLiBTaW4gZW1iYXJnbywgY29tbyBlbCBDSSBjb25zdGl0dXllIGludGVyY2FtYmlvcyBkZSBtZXJjYW5jw61hcyByZWFsaXphZGFzIGVuIGVsIMOhbWJpdG8gbmFjaW9uYWwsIGRpY2hhIHBhcnRpZGEgc2Ugb2J0aWVuZSBhIHBhcnRpciBkZSBsb3MgdmFsb3JlcyBvYnRlbmlkb3MgZW4gbGEgc2VyaWUgZGUgZW1wYWxtZSBDQ05OLiBEZSBpZ3VhbCBtYW5lcmEsIHNlIHV0aWxpesOzIGxhIE1TIHJlc3VsdGFudGUgZGUgZXN0YSDDumx0aW1hIGVzdGltYWNpw7NuLiANCg0KDQoNCg0KIyMgRm9ybXVsYWNpw7NuIG1hdGVtw6F0aWNhIGRlIGVzdGltYWNpb25lcw0KDQpWYWxvciBCcnV0byBkZSBQcm9kdWNjacOzbiB0b3RhbCwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIHByb3Bpbw0KJCRWQlBfe3Byb3BpYX0gPSAoUGV4dF97cGV0csOzbGVvfSAqIFFfe3BldHLDs2xlb30gKyBQZXh0X3tnYXN9ICogUV97Z2FzfSkgKiBUQ1AkJA0KDQpEb25kZTogDQoNCiogJFZCUF97cHJvcGlhfSQgPSBWYWxvciBCcnV0byBkZSBsYSBQcm9kdWNjacOzbiB0b3RhbCwgZXN0aW1hY2nDs24gcHJvcGlhDQoqICRQZXh0X3twZXRyw7NsZW99JCA9IFByZWNpbyBkZSBleHBvcnRhY2nDs24gbyByZWZlcmVuY2lhIGludGVybmFjaW9uYWwgZGVsIHBldHLDs2xlbyBjcnVkbyAoc2Vnw7puIGNvcnJlc3BvbmRhKQ0KKiAkUGV4dF97Z2FzfSQgPSBQcmVjaW8gZGUgZXhwb3J0YWNpw7NuIG8gcmVmZXJlbmNpYSBpbnRlcm5hY2lvbmFsIGRlbCBnYXMgbmF0dXJhbCAoc2Vnw7puIGNvcnJlc3BvbmRhKQ0KKiAkUV97cGV0csOzbGVvfSQgPSBDYW50aWRhZGVzIHByb2R1Y2lkYXMgdG90YWxlcyBkZSBwZXRyw7NsZW8gY3J1ZG8NCiogJFFfe2dhc30kID0gQ2FudGlkYWRlcyBwcm9kdWNpZGFzIHRvdGFsZXMgZGUgZ2FzIG5hdHVyYWwNCiogJFRDUCQgPSBUaXBvIGRlIENhbWJpbyBkZSBQYXJpZGFkDQoNCg0KVmFsb3IgQnJ1dG8gZGUgUHJvZHVjY2nDs24gdG90YWwsIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBDQ05ODQokJFZCUF97Q0NOTn0gPSAoUGludF97cGV0csOzbGVvfSAqIFFNSW50X3twZXRyw7NsZW99ICsgUGV4dF97cGV0csOzbGVvfSAqIEV4cG9fe3BldHLDs2xlb30gKyBQaW50X3tnYXN9ICogUU1JbnRfe2dhc30gKyBQZXh0X3tnYXN9ICogRXhwb197Z2FzfSkqIFRDQyQkDQoNCkRvbmRlOg0KDQoqICRWQlBfe0NDTk59JCA9IFZhbG9yIEJydXRvIGRlIGxhIFByb2R1Y2Npw7NuIHRvdGFsLCAgZXN0aW1hY2nDs24gcHJvcGlhIGNvbiBjcml0ZXJpbyBkZSBsYXMgQ0NOTg0KKiAkUGludF97cGV0csOzbGVvfSQgPSBQcmVjaW8gbWVyY2FkbyBpbnRlcm5vIGRlbCBwZXRyw7NsZW8gY3J1ZG8NCiogJFBpbnRfe2dhc30kID0gUHJlY2lvIG1lcmNhZG8gaW50ZXJubyBkZWwgZ2FzIG5hdHVyYWwNCiogJFFNSW50X3twZXRyw7NsZW99JCA9IGNhbnRpZGFkZXMgdmVuZGlkYXMgYWwgbWVyY2FkbyBpbnRlcm5vIGRlIHBldHLDs2xlbyBjcnVkbw0KKiAkUU1JbnRfe2dhc30kID0gY2FudGlkYWRlcyB2ZW5kaWRhcyBhbCBtZXJjYWRvIGludGVybm8gZGVsIGdhcyBuYXR1cmFsDQoqICRFeHBvX3twZXRyw7NsZW99JCA9IGV4cG9ydGFjaW9uZXMgZGUgcGV0csOzbGVvIGNydWRvDQoqICRFeHBvX3tnYXN9JCA9IGV4cG9ydGFjaW9uZXMgZGUgZ2FzIG5hdHVyYWwNCiogJFRDQyQgPSBUaXBvIGRlIENhbWJpbyBDb21lcmNpYWwNCg0KDQo8YnI+DQoNClZhbG9yIEJydXRvIGRlIFByb2R1Y2Npw7NuIGV4dHJhY2Npw7NuLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gQ0NOTg0KDQokJFZCUFxfZXh0cl97Q0NOTn0gPSBWQlBfe0NDTk59ICogKDEtcHJvcFxfc2VydmljaW9zKSQkDQoNCkRvbmRlOg0KDQoqICRWQlBcX2V4dHJfe0NDTk59JCA9IFZhbG9yIEJydXRvIGRlIGxhIFByb2R1Y2Npw7NuIGV4dHJhY2Npw7NuLCAgZXN0aW1hY2nDs24gcHJvcGlhIGNvbiBjcml0ZXJpbyBkZSBsYXMgQ0NOTg0KKiAkcHJvcFxfZXh0ciQgPSBwcm9wb3JjacOzbiBkZWwgVkJQIGRlIHNlcnZpY2lvcyBkZSBhcG95byBzb2JyZSBWQlAgZGUgZXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIHkgZ2FzDQoNCg0KUHJvcG9yY2nDs24gZGUgbG9zIHNlcnZpY2lvcyBkZSBhcG95byBzb2JyZSBsYSBleHRyYWNjacOzbiBkZSBwZXRyw7NsZW8geSBnYXMNCjxicj4NCiQkcHJvcFxfc2VydmljaW9zID0gXGZyYWN7VkJQXF9zZXJ2aWNpb3Nfe0NPVX19e1ZCUFxfZXh0cl97Q09VfSArIFZCUFxfc2VydmljaW9zX3tDT1V9fSQkDQoNCkRvbmRlOg0KDQoqICRWQlBcX3NlcnZpY2lvc197Q09VfSQgPSBWQlAgZGUgc2VydmljaW9zIGRlIGFwb3lvIGRlbCBDdWFkcm8gZGUgVXRpbGl6YWNpw7NuIGRlIE9mZXJ0YQ0KKiAkVkJQXF9leHRyYWNjacOzbl97Q09VfSQgPSBWQlAgZGUgZXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIHkgZ2FzIGRlbCBDdWFkcm8gZGUgVXRpbGl6YWNpw7NuIGRlIE9mZXJ0YQ0KDQoNCg0KPGJyPg0KQ29uc3VtbyBJbnRlcm1lZGlvLCB2YWxvcmVzIG9maWNpYWxlcyBkZSBsYXMgQ0NOTg0KJCQgQ0lfe0NDTk59ID0gVkJQX3tDQ05OfSAtICBWQV97Q0NOTn0gJCQNCg0KRG9uZGU6DQoNCiogJENJX3tDQ05OfSQgPSBDb25zdW1vIEludGVybWVkaW8gdG90YWwsIGVzdGltYWNpw7NuIHByb3BpYQ0KKiAkVkFfe0NDTk59JCA9IFZhbG9yIEFncmVnYWRvLCBlc3RpbWFjacOzbiBkZSBsYXMgQ0NOTiANCg0KPGJyPg0KQ29uc3VtbyBJbnRlcm1lZGlvLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gQ0NOTg0KJCQgQ0lfe0NDTk59ID0gVkJQX3tDQ05OfSAqICBDb2VmXF90ZWMgJCQNCkRvbmRlOg0KDQoqICRDb2VmXF90ZWMkID0gQ29lZmljaWVudGUgdMOpY25pY28gZGUgTWF0cml6IEluc3VtbyBQcm9kdWN0bw0KDQo8YnI+DQpDb25zdW1vIEludGVybWVkaW8gZGUgZXh0cmFjY2nDs24sIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBDQ05ODQoNCiQkIENJXF9leHRyX3tDQ05OfSA9IFZCUFxfZXh0cl97Q0NOTn0gKiAgQ29lZlxfdGVjICQkDQoNCkRvbmRlOg0KDQoqICQgQ0lcX2V4dHJfe0NDTk59JCA9IENvbnN1bW8gSW50ZXJtZWRpbyBkZSBleHRyYWNjacOzbiwgZXN0aW1hY2nDs24gY3JpdGVyaW8gQ0NOTg0KDQo8YnI+DQpNYXNhIFNhbGFyaWFsLCB2YWxvcmVzIG9maWNpYWxlcyBkZSBsYXMgQ0NOTg0KJCRNUyA9IFcgKiBFbXAgKiAxMyQkDQpEb25kZTogDQoNCiogJE1TJCA9IE1hc2EgU2FsYXJpYWwgDQoqICRXJCA9ICBTYWxhcmlvIGFudWFsIHByb21lZGlvDQoqICRFbXAkID0gRW1wbGVvDQoNCjxicj4NCk1hc2EgU2FsYXJpYWwsIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBDQ05ODQokJE1TID0gIFZCUF97Q0NOTn0gKiAgQ29lZlxfTVMkJA0KDQpEb25kZTogDQoNCiogJENvZWZcX01TJCA9IENvZWZpY2llbnRlIGRlIGxhIHByb3BvcmNpw7NuIGRlIE1TIHNvYnJlIFZCUA0KDQo8YnI+DQpNYXNhIFNhbGFyaWFsIGRlIGV4dHJhY2Npw7NuLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gQ0NOTg0KJCRNU1xfZXh0ciA9ICBWQlBcX2V4dHJfe0NDTk59ICogIENvZWZcX01TJCQNCg0KRG9uZGU6IA0KDQogICogJE1TXF9leHRyJCA9IE1hc2Egc2FsYXJpYWwgZGVsIHNlY3RvciBleHRyYWNjacOzbg0KDQo8YnI+DQpWYWxvciBhZ3JlZ2FkbywgZXN0aW1hY2nDs24gY3JpdGVyaW8gQ0NOTg0KJCRWQV97Q0NOTn0gID0gVkJQX3tDQ05OfSDigJMgQ0lfe0NDTk59ICQkDQpEb25kZToNCg0KKiAkVkFfe0NDTk59JCA9IFZhbG9yIEFncmVnYWRvLCBlc3RpbWFjacOzbiBwcm9waWEgY29uIGNyaXRlcmlvIENDTk4NCg0KPGJyPg0KVmFsb3IgYWdyZWdhZG8gZGUgZXh0cmFjY2nDs24sIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBDQ05ODQokJFZBXF9leHRyX3tDQ05OfSAgPSBWQlBcX2V4dHJfe0NDTk59IOKAkyBDSVxfZXh0cl97Q0NOTn0gJCQNCg0KRG9uZGU6DQoNCiogJFZBXF9leHRyX3tDQ05OfSQgPSBWYWxvciBBZ3JlZ2FkbyBkZSBleHRyYWNjacOzbiwgZXN0aW1hY2nDs24gcHJvcGlhIGNvbiBjcml0ZXJpbyBDQ05OIA0KDQoNCjxicj4NClZhbG9yIGFncmVnYWRvLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gcHJvcGlvDQokJFZBX3twcm9waWF9ICA9IFZCUF97cHJvcGlhfSDigJMgQ0lcX2V4dHJfe0NDTk59ICQkDQoNCkRvbmRlOg0KDQoqICRWQV97cHJvcGlhfSQgPSBWYWxvciBBZ3JlZ2FkbywgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIHByb3BpbyANCg0KDQo8YnI+DQoNCkV4Y2VkZW50ZSBCcnV0byBkZSBFeHBsb3RhY2nDs24sIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBDQ05ODQokJEVCRV97Q0NOTn0gID0gVkFfe0NDTk59IOKAkyBNUyAgICQkDQo8YnI+DQoNCkV4Y2VkZW50ZSBCcnV0byBkZSBFeHBsb3RhY2nDs24gZGUgZXh0cmFjY2nDs24sIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBDQ05ODQokJEVCRVxfZXh0cl97Q0NOTn0gID0gVkFcX2V4dHJfe0NDTk59IOKAkyBNU1xfZXh0ciAgICQkDQoNCjxicj4NCg0KRXhjZWRlbnRlIEJydXRvIGRlIEV4cGxvdGFjacOzbiwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIHByb3Bpbw0KJCRFQkVfe3Byb3BpYX0gID0gVkFfe3Byb3BpYX0g4oCTIE1TXF9leHRyICAgJCQNCg0KDQpEb25kZToNCg0KKiAkRUJFJCA9IEV4Y2VkZW50ZSBCcnV0byBkZSBFeHBsb3RhY2nDs24NCiogJENJXF9leHRyX3tDQ05OfSQgPSBDb25zdW1vIGludGVybWVkaW8gZGVsIHNlY3RvciBleHRyYWNjacOzbiwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIENDTk4NCg0KDQo8YnI+DQpDb25zdW1vIGRlIENhcGl0YWwgRmlqbywgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIHByb3Bpbw0KJCRDb25LZmlqbyA9IFBQeUUgKiAgcHJvbShcZnJhY3tEZXB9e1BQeUV9KSAkJA0KDQpEb25kZTogDQoNCiogJENvbktmaWpvJCA9IENvbnN1bW8gZGUgQ2FwaXRhbCBGaWpvDQoqICRQUHlFJD0gUHJvcGllZGFkLCBQbGFudGEgeSBFcXVpcG8gbmV0YQ0KKiAkcHJvbShcZnJhY3tEZXB9e1BQeUV9KSAkID0gIHRhc2EgZGUgZGVwcmVjaWFjacOzbiBwcm9tZWRpbw0KKiAkRGVwJCA9IERlcHJlY2lhY2lvbmVzIChjdWVudGEgZ2FzdG9zIHBvciBuYXR1cmFsZXphKQ0KDQo8YnI+DQoNClBsdXN2YWzDrWEgKEV4Y2VkZW50ZSBOZXRvIGRlIEV4cGxvdGFjacOzbiksIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBwcm9waW8NCiQkUFZfe3Byb3BpYX0gPSBWQV97cHJvcGlhfSAtIENvbktmaWpvIC0gSW1wICQkDQoNCg0KRG9uZGU6DQoNCiogJFBWX3twcm9waWF9JCA9IFBsdXN2YWzDrWEgKCpFeGNlZGVudGUgTmV0byBkZSBFeHBsb3RhY2nDs24qKQ0KKiAkSW1wJCA9IEltcHVlc3RvcyBub3JtYWxlcw0KDQoNCg0KIyMgRnVlbnRlcyBwYXJhIGxhIGNvbnN0cnVjY2nDs24gZGUgc2VyaWVzIA0KDQoqIFByb2R1Y2Npw7NuIGRlIENydWRvOiANCiAgKyAxOTExIGEgMTk5MjogQW51YXJpbyBkZSBjb21idXN0aWJsZXMgDQogICsgMTk5MyAtIGFjdHVhbGlkYWQ6IFNFU0NPIERvd25zdHJlYW0NCiAgDQoqIEV4cG9ydGFjaW9uZXMgZGUgQ3J1ZG86IA0KICArIDE5NjIgYSAxOTkzOiBVTiBDb210cmFkZSAoY2xhc2lmaWNhY2nDs24gU0lUQyBhcyByZXBvcnRlZCkNCiAgKyAxOTk0IGVuIGFkZWxhbnRlOiBTRVNDTyBEb3duc3RyZWFtDQogICsgTG9zIGRhdG9zIGZhbHRhbnRlcyBkZSBTRVNDTyBzZSBjb21wbGV0YXJvbiBjb24gTUVDT04NCiAgKyBTaWd1ZW4gaGFiaWVuZG8gZGF0b3MgZmFsdGFudGVzIHBhcmEgbG9zIGHDsW9zIDE5NjUsIDE5NzAtNzQsIDE5NzYtNzgsIDE5ODAtODQNCiAgDQoqIFByZWNpbyBNZXJjYWRvIEludGVybm8gZGUgQ3J1ZG86IA0KICArIDE5NjMgYSAxOTY1OiBLb3p1bGogeSBQaXN0b25lc2kgLSBSZXZpc3RhIElERUUgYWp1c3RhZG8gY29uIGVsIMOtbmRpY2UgZGVsIHByZWNpbyBkZWwgQW51YXJpbyBkZSBZUEYgDQogICsgMTk4OSBhIDE5OTE6IEFudWFyaW8gZGUgWVBGDQogICsgMTk2NiBhIDE5ODg6IEtvenVsaiB5IFBpc3RvbmVzaSAtIFJldmlzdGEgSURFRQ0KICArIDE5OTI6IE1FQ09OIGFqdXN0YWRvIGNvbiBsYSB2YXJpYWNpw7NuIGRlbCDDjW5kaWNlIGRlIHByZWNpb3MgaW50ZXJub3MgYWwgcG9yIG1heW9yIChJUElNKQ0KICArIDE5OTMgZW4gYWRlbGFudGU6IE1FQ09OIA0KICANCiogUHJlY2lvIE1lcmNhZG8gRXh0ZXJubyBDcnVkbzoNCiAgKyBlbnRyZSAxOTYyIHkgMTk5MjogcHJlY2lvIGRlIGV4cG9ydGFjacOzbiBhcmdlbnRpbmEgZGUgVU4gQ29tdHJhZGUNCiAgKyBlbnRyZSAxOTkzLTIwMDEgeSAyMDA0LTIwMTQ6IHByZWNpbyBkZSBleHBvcnRhY2nDs24gYXJnZW50aW5hIGRlIE1lY29uDQogICsgZW50cmUgMjAwMiB5IDIwMDM6IHByZWNpbyBkZSBleHBvcnRhY2nDs24gZGUgQXJnZW50aW5hIGRlIFVOIENvbXRyYWRlIChDbGFzaWZpY2FjacOzbiBIUyBhcyByZXBvcnRlZCkgIA0KICArIDIwMTQgZW4gYWRlbGFudGU6IHByZWNpbyBkZSBleHBvcnRhY2nDs24gYXJnZW50aW5hIGRlIFNlY3JldGFyw61hIGRlIEVuZXJnw61hIChSZWdhbMOtYXMpDQogICsgVmFsb3JlcyBmYWx0YW50ZXMgcHJldmlvcyBhIDE5OTI6IEJyZW50ICAoRnVlbnRlOiBJbmZsYXRpb24gRGF0YSkNCiAgDQoqIFByb2R1Y2Npw7NuIGRlIEdhczoNCiAgKyAxOTExIGEgMTk5MjogQW51YXJpbyBkZSBjb21idXN0aWJsZXMgDQogICsgMTk5MyBlbiBhZGVsYW50ZTogU0VTQ08gRG93bnN0cmVhbQ0KICANCiogRXhwb3J0YWNpb25lcyBkZSBnYXM6IA0KICArIDE5NjIgYSAxOTk2OiBVTiBDb210cmFkZSwNCiAgKyAxOTk3IGVuIGFkZWxhbnRlOiBTRVNDTyBEb3duc3RyZWFtDQogICsgRGF0b3MgZmFsdGFudGVzIHBhcmEgbG9zIGHDsW9zIDE5OTkgeSAyMDAwDQogIA0KKiBQcmVjaW8gTWVyY2FkbyBJbnRlcm5vIGRlIGdhczoNCiAgKyAxOTYzIC0gMTk2OSAmIDE5ODkgLSAxOTkyOiBBbnVhcmlvIGRlIFlQRg0KICArIDE5NzAgLSAxOTg4OiAgS296dWxqIHkgUGlzdG9uZXNpIC0gUmV2aXN0YSBJREVFDQogICsgMTk5MyBlbiBhZGVsYW50ZTogU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgLSBCYXNlIFJlZ2Fsw61hcw0KICArIEVsIGRhdG8gZGVsIGHDsW8gMTk5MiBzZSBkaXZpZGnDsyBwb3IgMTAsIGRhZG8gcXVlIHJlc3VsdGFiYSBleGNlc2l2YW1lbnRlIGFsdG8sIGxvIGN1YWwgZXMgbWV0b2RvbMOzZ2ljYW1lbnRlIGluYWNlcHRhYmxlIHBlcm8gc2lydmUgZGUgZWplcmNpY2lvLiANCiAgDQoqIFByZWNpbyBNZXJjYWRvIEV4dGVybm86DQogICsgQcOxb3MgMTk2NCB5IDE5NjU6IFByZWNpbyBkZSBpbXBvcnRhY2nDs24gZGUgZ2FzIHByb3ZlbmllbnRlIGRlIEJvbGl2aWEgaGFjaWEgQXJnZW50aW5hIGRlIFVOIENvbXRyYWRlDQogICsgMTk2NiBlbiBhZGVsYW50ZTogUHJlY2lvIGRlIGV4cG9ydGFjaW9uIGRlIGdhcyBkZXNkZSBCb2xpdmlhIGEgQXJnZW50aW5hIGRlIFVOIENvbXRyYWRlDQogICsgRGF0b3MgZmFsdGFudGVzIHBhcmEgbG9zIGHDsW9zIHByZXZpb3MgYSAxOTYzIHkgcGVyw61vZG8gMTk2OC0xOTcxIA0KDQoqIFZhbG9yIEJydXRvIGRlIGxhIFByb2R1Y2Npw7NuLCBWYWxvciBBZ3JlZ2FkbyB5IENvbnN1bW8gSW50ZXJtZWRpbzoNCiAgKyBJTkRFQyAtIERpcmVjY2nDs24gTmFjaW9uYWwgZGUgQ3VlbnRhcyBOYWNpb25hbGVzIChCYXNlIE1pbmVyw61hIGUgSGlkcm9jYXJidXJvcyBkZSBsYXMgQ3VlbnRhcyBOYWNpb25hbGVzKS4gTGFzIHZhcmlhYmxlcyAiZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zIiByZWZpZXJlbiBhICJFeHRyYWNjacOzbiBkZSBwZXRyw7NsZW8gY3J1ZG8geSBnYXMgbmF0dXJhbC4gQWN0aXZpZGFkZXMgZGUgc2VydmljaW9zIHJlbGFjaW9uYWRhcyBjb24gbGEgZXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIHkgZ2FzLCBleGNlcHRvIGxhcyBhY3RpdmlkYWRlcyBkZSBwcm9zcGVjY2nDs24iDQogICsgQ8OhbGN1bG8gcHJvcGlvIGRlbCBWQlAgY29uIGRhdG9zIGRhdG9zIGRlIHByb2R1Y2Npw7NuIHkgcHJlY2lvIGludGVybmFjaW9uYWwgcmVjb3BpbGFkb3MuIExhcyBmdWVudGVzIHNvbiBsYXMgc2lndWllbnRlcyAobG9zIGNyaXRlcmlvcyBzb24gbG9zIG1pc21vcyBwYXJhIGxhIHV0aWxpemFjacOzbiBwb3N0ZXJpb3IgZW4gZWwgY8OhbGN1bG8gZGUgcmVudGEgZGUgbGEgdGllcnJhIGhpZHJvY2FyYnVyw61mZXJhIHBvciBkaWZlcmVuY2lhbCBkZSBwcmVjaW9zLCBzb2JyZXZhbHVhY2nDs24gY2FtYmlhcmlhIHkgb3Ryb3MgbWVjYW5pc21vcykNCg0KKiBTYWxhcmlvIHkgZW1wbGVvDQogICsgMTk2MC0xOTk2OiBlc3RpbWFjacOzbiBhIHBhcnRpciBkZSBhcGxpY2FjacOzbiBkZWwgY29lZmljaWVudGUgZGUgcHJvcG9yY2nDs24gZGUgbGEgbWFzYSBzYWxhcmlhbCBzb2JyZSBlbCBWQlANCiAgKyAxOTk2IGVuIGFkZWxhbnRlOiBNaW5pc3RlcmlvIGRlIFRyYWJham8sIEVtcGxlbyB5IFNlZ3VyaWRhZCBTb2NpYWwgLSBPYnNlcnZhdG9yaW8gZGUgRW1wbGVvIHkgRGluw6FtaWNhIEVtcHJlc2FyaWFsIChPRURFKQ0KDQoqIENvbnN1bW8gZGUgY2FwaXRhbCBmaWpvDQogICsgQ29lZmljaWVudGUgZGUgZGVwcmVjaWFjacOzbiBlc3RpbWFkbyBhIHBhcnRpciBkZSBFc3RhZG9zIENvbnRhYmxlcyBkZSBZUEYgKDE5OTgtMjAxOCkNCjxicj4NCg0KDQoNCiMjIyBDdWVudGFzIE5hY2lvbmFsZXMNCg0KW1Byb2R1Y3RvIEludGVybm8gQnJ1dG8gRXhwbG90YWNpw7NuIE1pbmFzIHkgQ2FudGVyYXMgTWlsbG9uZXMgZGUgcGVzb3MgY29uc3RhbnRlcy4gQmFzZSAxOTYwLiBWYWxvcmVzIHRyaW1lc3RyYWxlcw0KUElCIEV4cGxvdGFjacOzbiBNaW5hcyB5IENhbnRlcmFzIGVuIG1pbGxvbmVzIGRlIHBlc29zIGRlIDE5NjAuIDE5NzAtMTk4MF0oaHR0cHM6Ly9kYXRvcy5nb2IuYXIvZGF0YXNldC9zc3BtLXByb2R1Y3RvLWludGVybm8tYnJ1dG8tc2VjdG9yaWFsLTE5NzAtMTk4MCkNCg0KDQpbUHJvZHVjdG8gSW50ZXJubyBCcnV0byBFeHBsb3RhY2nDs24gTWluYXMgeSBDYW50ZXJhcywgQXVzdHJhbGVzIGNvbnN0YW50ZXMuIEJhc2UgMTk3MC5WYWxvcmVzIHRyaW1lc3RyYWxlcw0KUElCIEV4cGxvdGFjacOzbiBNaW5hcyB5IENhbnRlcmFzIGVuIGF1c3RyYWxlcyBhIHByZWNpb3MgZGUgMTk3MC4gMTk4MC0xOTkwXShodHRwczovL2RhdG9zLmdvYi5hci9kYXRhc2V0L3NzcG0tcHJvZHVjdG8taW50ZXJuby1icnV0by1zZWN0b3JpYWwtMTk4MC0xOTkwKSANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiNNSVAgOTcNCiMgY29lZmljaWVudGVzIGRlIHJlcXVlcmltaWVudG9zIGRpcmVjdG9zDQoNCm1pcF85NyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9NSVAvbWlwX21hdHJpejEyLnhscyIsIA0KICAgIHNraXAgPSA3KSAlPiUgDQogIHNlbGVjdCgtIi4uLjEiKSAlPiUgDQogIHJlbmFtZShhY3RpdmlkYWQgPSAiLi4uMiIpDQogICMgZmlsdGVyKCIuLi4yIiAlaW4lIGMoICJVc29zIGRlIGxhIHByb2R1Y2Npw7NuIG5hY2lvbmFsIGEgcHJlY2lvcyBiw6FzaWNvcyIsICAiVmFsb3IgYnJ1dG8gZGUgbGEgcHJvZHVjY2nDs24gYSBwcmVjaW9zIGLDoXNpY29zIiApKQ0KDQpjaV9leHRyYWNjaW9uIDwtIG1pcF85N1tjKDEyNiwxNDkpLCBjKCJhY3RpdmlkYWQiICwgIkV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbywgZ2FzLCBjYXJiw7NuIHkgdXJhbmlvIildDQoNCmNvZWZfdGVjbmljb185NyA8LSBjaV9leHRyYWNjaW9uWzEsMl0vY2lfZXh0cmFjY2lvblsyLDJdDQoNCnggPC0gbWlwXzk3W2MoMTQwLCAxNDkpLF0gIyU+JSANCiAgICMgZ2F0aGVyKGtleSA9IHNlY3RvciwgdmFsdWUgPSB2YWxvciwgMjpuY29sKC4pKSAlPiUgDQoNCmltcF9wcm9tXzk3IDwtIGFwcGx5KFggPSB4WzEsMjpuY29sKHgpXS94WzIsMjpuY29sKHgpXSAsIE1BUkdJTiA9IDEgLCBGVU4gPSBmdW5jdGlvbih4KSBtZWFuKHgsIG5hLnJtPVQpICApDQogICAgDQoNCiMgY29lZiBDVU8gMjAwNCBhIHBhcnRpciBkZSBDSS9WQlANCiMgY29lZl90ZWNuaWNvIDwtICAwLjM2OTEwNDMwMg0KDQoNCiNQZXNvIGRlIGxvcyBzZXJ2aWNpb3MNCiNDVU8gDQojbGEgc3VtYSBkZSBsYXMgY29sdW1uYXMgbm9zIGRhIGVsIFZCUA0KQ09VIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL01JUC9zaF9jb3VfMDZfMTYueGxzIiwgDQogICAgc2tpcCA9IDIpICU+JQ0KICByZW5hbWUocHJvZHVjdG8gPSAiLi4uMSIsDQogICAgICAgICBjcGMgPSAiLi4uMiIpICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QocHJvZHVjdG8sICJcXGQiKSAmICEoc3RyX2RldGVjdChwcm9kdWN0bywgIl5OIikpKSAlPiUNCiAgZ3JvdXBfYnkocHJvZHVjdG8pICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpDQoNCnNlcnZpY2lvX3NfZXh0cmFjY2lvbiA8LSAgc3VtKENPVVsxMl0pLyggc3VtKENPVVsxMV0pICsgc3VtKENPVVsxMl0pICkNCm5yb3coQ09VKQ0KDQoNCiMgRGVwcmVjaWFjacOzbiBkZWwgc3RvY2sNCmNvbnN1bW9fa19maWpvX3lwZiA8LSAocmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0JhbGFuY2VzL2dhcyB5IHBldHJvbGVvX2RhdG9zL2RhdG9zX3IvcmVzdWx0YWRvcy9iYWxhbmNlc19hcmcuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhYMSA9IGNvbF9za2lwKCkpKSAlPiUNCiAgZmlsdGVyKGVtcHJlc2EgPT0gIllQRiIpICU+JSANCiAgZ3JvdXBfYnkoZW1wcmVzYSkgJT4lIA0KICBtdXRhdGUodGFzYV9kZXByZWNpYWNpb24gPSBkZXByZWNpYWNpb25lcy9wcHllKSAlPiUgDQogIHN1bW1hcmlzZSh0YXNhX2RlcHJlY2lhY2lvbiA9IG1lYW4oZGVwcmVjaWFjaW9uZXMvcHB5ZSkpKSR0YXNhX2RlcHJlY2lhY2lvbg0KDQp2YXIoKHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9CYWxhbmNlcy9nYXMgeSBwZXRyb2xlb19kYXRvcy9kYXRvc19yL3Jlc3VsdGFkb3MvYmFsYW5jZXNfYXJnLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkgJT4lDQogIGZpbHRlcihlbXByZXNhID09ICJZUEYiKSAlPiUgDQogIGdyb3VwX2J5KGZlY2hhKSAlPiUNCiAgc3VtbWFyaXNlKHRhc2FfZGVwcmVjaWFjaW9uID0gbWVhbihkZXByZWNpYWNpb25lcy9wcHllKSkpJHRhc2FfZGVwcmVjaWFjaW9uKQ0KDQoNCg0KYGBgDQoNCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojQ0NOTiAoZGF0b3Mgb2ZpY2lhbGVzKQ0KIyMgQmFzZSBtaW5lcsOtYQ0KY2Nubl9vZmljaWFsIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvTWVjb24vYmFzZS1taW5lcmlhLWUtaGlkcm9jYXJidXJvcyBjdWVudGFzIG5hY2lvbmFsZXMueGxzIiwgc2hlZXQgPSAiQ3VlbnRhcyBOYWNpb25hbGVzIiwgc2tpcCA9IDUpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiQcOxbyIsDQogICAgICAgICBwZXJpb2RvID0iUGVyw61vZG8iLA0KICAgICAgICB2YnBfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zID0gICIuLi41IiwNCiAgICAgICAgdmFfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zID0gICIuLi4xNSIpICU+JSANCiAgZmlsdGVyKGlzLm5hKHBlcmlvZG8pLCAhaXMubmEoYW5pbykgKSAlPiUgICNmaWx0cmFtb3MgbG9zIGRhdG9zIGFudWFsZXMNCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxlcyBkZSBwZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgIHZicF9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3M9IGFzLmRvdWJsZSh2YnBfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zKSwNCiAgICAgICAgIHZhX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcz0gYXMuZG91YmxlKHZhX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyksDQogICAgICAgICB2YnBfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zID0gdmJwX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyAqICgxIC0gc2VydmljaW9fc19leHRyYWNjaW9uKSwNCiAgICAgICAgIHZhX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyA9IHZhX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyAqICgxIC0gc2VydmljaW9fc19leHRyYWNjaW9uKSwNCiAgICAgICAgIGNpX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcz0NCiAgICAgICAgICAgdmJwX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcy12YV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICBjaV9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MgPSB2YnBfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zIC0gdmFfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsDQogICAgICAgICB2YnBfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zICwgDQogICAgICAgICB2YV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICBjaV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICB2YnBfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zICwgDQogICAgICAgICB2YV9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICBjaV9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkKSAlPiUNCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSB7eC8xMF4zfSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgY29ycmllbnRlcyIpICU+JSANCiAgbGVmdF9qb2luKG1hc2Ffc2FsYXJpYWxfaGlkcm9jYXJidXJvcyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgdW5pZGFkLA0KICAgICAgICAgICAgICAgICAgICAgbXNfdG90ID0gbWFzYV9zYWxhcmlhbF90b3RhbF9vZWRlLA0KICAgICAgICAgICAgICAgICAgICAgbXNfZXh0ciA9bWFzYV9zYWxhcmlhbF9leHRyYWNjaW9uX29lZGUgKSwgYnkgPSBjKCJhbmlvIiwgInVuaWRhZCIpKSAlPiUgDQogIG11dGF0ZShlYmVfdG90ID0gdmFfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zIC0gbXNfdG90LA0KICAgICAgICAgZWJlX2V4dHIgPSB2YV9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MgLW1zX2V4dHIsDQogICAgICAgICBmdWVudGUgPSAiQ0NOTiBvZmljaWFsIiApICU+JSANCiAgcmVuYW1lKHZicF9leHRyID0gdmJwX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcywNCiAgICAgICAgIGNpX2V4dHIgPSBjaV9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICB2YV9leHRyID12YV9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICB2YnBfdG90PSB2YnBfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zICwgDQogICAgICAgICB2YV90b3Q9IHZhX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcywNCiAgICAgICAgIGNpX3RvdCA9IGNpX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcykgJT4lIA0KICB1bmdyb3VwKCkNCmNjbm5fb2ZpY2lhbA0KDQptZWFuX2NvZWZfbXMgPC0gIGNjbm5fb2ZpY2lhbCAlPiUgDQogIHN1bW1hcmlzZShjb2VmX21zX3RvdCA9IG1lYW4obXNfdG90L3ZicF90b3QsbmEucm09IFQpLA0KICAgICAgICAgICAgICBjb2VmX21zX2V4dHI9IG1lYW4obXNfZXh0ci92YnBfZXh0ciAsbmEucm09IFQpKQ0KDQptZWRpYW5fY29lZl9tcyA8LSAgY2Nubl9vZmljaWFsICU+JSANCiAgc3VtbWFyaXNlKGNvZWZfbXNfdG90ID0gbWVkaWFuKG1zX3RvdC92YnBfdG90LG5hLnJtPSBUKSwNCiAgICAgICAgICAgICAgY29lZl9tc19leHRyPSBtZWRpYW4obXNfZXh0ci92YnBfZXh0ciAsbmEucm09IFQpKQ0KDQojICMgZXN0aW1hY2lvbiBwcm9waWEgY29lZiB0ZWNuaWNvDQojIGNjbm5fb2ZpY2lhbCAlPiUgDQojICAgc3VtbWFyaXNlKGNvZWZfcmVxX2V4dHJfeV9zZXJ2ID1tZWFuKGNpX2V4dHJfeV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcy92YnBfZXh0cl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zLCBuYS5ybT1UKSwNCiMgICAgICAgICAgY29lZl9yZXFfZXh0ciA9IG1lYW4oY2lfZXh0cl9oaWRyb2NhcmJ1cm9zL3ZicF9leHRyX2hpZHJvY2FyYnVyb3MsIG5hLnJtPVQpKQ0KDQoNCiMgQmFzZSBJTkRFQw0KeCA8LSByZWFkX2V4Y2VsKCJkYXRhL2luZGVjL3NoX1ZCUF9WQUJfMDNfMjEueGxzIiwgc2hlZXQgPSAzLCBza2lwID0gMykgJT4lIA0KICBuYS5vbWl0KCkgDQpuYW1lcyh4KSA8LWMoInNlY3RvciIsIDIwMDQ6MjAyMCkNCnZicF9jY25uIDwtIHggJT4lIA0KICBnYXRoZXIoa2V5ID0gYW5pbyx2YWx1ZSA9IHZicF90b3QgLCAyOm5jb2woLikpDQoNCnkgPC0gcmVhZF9leGNlbCgiZGF0YS9pbmRlYy9zaF9WQlBfVkFCXzAzXzIxLnhscyIsIHNoZWV0ID0gNSwgc2tpcCA9IDQpICU+JSANCiAgc2VsZWN0KDEsIGNvbnRhaW5zKCJUb3RhbCIpKSAlPiUgDQogIG5hLm9taXQoKSANCm5hbWVzKHkpIDwtYygic2VjdG9yIiwgMjAwNDoyMDIwKQ0KdmFfY2NubiA8LSB5ICU+JSANCiAgZ2F0aGVyKGtleSA9IGFuaW8sdmFsdWUgPSB2YV90b3QgLCAyOm5jb2woLikpDQoNCmNjbm5fb2ZpY2lhbCA8LSB2YV9jY25uICU+JSANCiAgZmlsdGVyKGdyZXBsKCJFeHRyYWNjacOzbiBkZSBwZXRyw7NsZW8iLCBzZWN0b3IpKSAlPiUgDQogIGlubmVyX2pvaW4odmJwX2Njbm4gJT4lIGZpbHRlcihncmVwbCgiRXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIiwgc2VjdG9yKSksIGJ5ID0gYygic2VjdG9yIiwgImFuaW8iKSkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IGFzLmRvdWJsZShhbmlvKSkgJT4lIA0KICBsZWZ0X2pvaW4obWFzYV9zYWxhcmlhbF9oaWRyb2NhcmJ1cm9zICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICB1bmlkYWQsDQogICAgICAgICAgICAgICAgICAgICBtc190b3QgPSBtYXNhX3NhbGFyaWFsX3RvdGFsX29lZGUsDQogICAgICAgICAgICAgICAgICAgICBtc19leHRyID1tYXNhX3NhbGFyaWFsX2V4dHJhY2Npb25fb2VkZSApLCBieSA9IGMoImFuaW8iKSkgJT4lIA0KICBtdXRhdGUodmJwX2V4dHIgPSB2YnBfdG90KiAoMSAtIHNlcnZpY2lvX3NfZXh0cmFjY2lvbiksDQogICAgICAgICB2YV9leHRyID0gdmFfdG90KiAoMSAtIHNlcnZpY2lvX3NfZXh0cmFjY2lvbiksDQogICAgICAgICBjaV90b3QgPSB2YnBfdG90IC0gdmFfdG90LA0KICAgICAgICAgY2lfZXh0ciA9IHZicF9leHRyICAtIHZhX2V4dHIsDQogICAgICAgICBlYmVfdG90ID12YV90b3QtbXNfdG90LA0KICAgICAgICAgZWJlX2V4dHIgPSB2YV9leHRyIC1tc19leHRyLA0KICAgICAgICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIGNvcnJpZW50ZXMiLA0KICAgICAgICAgIGZ1ZW50ZSA9ICJDQ05OIG9maWNpYWwiICkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBmdWVudGUsIGV2ZXJ5dGhpbmcoLiksIC1zZWN0b3IpDQoNCiMjIFZBIHkgVkJQIHByZWNpb3MgOTMNCnggPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvcmVwb3MvaGlkcm9jYXJidXJvcy9hbmFsaXNpcy9kYXRhL21lY29uL1BCSV9CYXNlIDE5OTNfUE0ueGxzeCIsIA0KICAgIHNoZWV0ID0gIlZCUCBjIiwgY29sX3R5cGVzID0gYygidGV4dCIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiKSwgc2tpcCA9IDYpICU+JSANCiAgICBzZWxlY3QoMSwgIWNvbnRhaW5zKCJJIikpDQpuYW1lcyh4KSA8LSBjKCJzZWN0b3IiLCAxOTkzOjIwMDkpDQp2YnBfOTMgPC0geCAlPiUgDQogIGdhdGhlcihrZXkgPSBhbmlvLHZhbHVlID0gdmJwX3RvdCAsIDI6bmNvbCguKSkNCg0KeSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9yZXBvcy9oaWRyb2NhcmJ1cm9zL2FuYWxpc2lzL2RhdGEvbWVjb24vUEJJX0Jhc2UgMTk5M19QTS54bHN4IiwgDQogICAgc2hlZXQgPSAiVkFCIGMiLCBza2lwID0gNikgJT4lIA0KICAgIHNlbGVjdCgxLCAhY29udGFpbnMoIkkiKSkNCm5hbWVzKHkpIDwtIGMoInNlY3RvciIsIDE5OTM6MjAwOSkNCnZhXzkzIDwtIHkgJT4lIA0KICBnYXRoZXIoa2V5ID0gYW5pbyx2YWx1ZSA9IHZhX3RvdCAsIDI6bmNvbCguKSkNCg0KdmFsb3JfcHJvZHVjY2lvbl85MyA8LSB2YV85MyAlPiUgIGlubmVyX2pvaW4odmJwXzkzKSAlPiUgDQogIG11dGF0ZShhbmlvID0gYXMuZG91YmxlKGFuaW8pKQ0KDQpjb25zdW1vX2ludGVybWVkaW9fOTMgPC0gdmFsb3JfcHJvZHVjY2lvbl85MyAlPiUgDQogIGZpbHRlcihncmVwbCgiQyAtIEVYUExPVEFDSU9OIERFIE1JTkFTIFkgQ0FOVEVSQVMiLCBzZWN0b3IpKSAlPiUgDQogIG11dGF0ZShjb2VmX3RlY185MyA9IDEtKHZhX3RvdC92YnBfdG90KSwgDQogICAgICAgICAgIGNvZWZfdGVjXzkzX2luZGV4ID0gZ2VuZXJhcl9pbmRpY2UoY29lZl90ZWNfOTMsIGZlY2hhID0gYW5pbywgZmVjaGFfYmFzZSA9IDIwMDQpKQ0KICANCiMjIFNlcmllIGRlIENJDQojIDwgMTk5NyA6IE1JUCA5Nw0KIyA5NyBhIDIwMDQgOiBwcm9ncmVzaW9uIGRlIG1pcDk3IGEgaW5kZWMNCiMgMjAwNCBhIDIwMTk6IGluZGVjDQpjb2VmX2NvbnN1bW9faW50ZXJtZWRpbyA8LSBkYXRhLmZyYW1lKGFuaW8gPSAxOTYwOjIwMjApICU+JQ0KICBsZWZ0X2pvaW4oY2Nubl9vZmljaWFsICU+JSAgc2VsZWN0KGFuaW8sIHZicF90b3QsIHZhX3RvdCksIGJ5ID0gImFuaW8iKSAlPiUgDQogIGxlZnRfam9pbihjb25zdW1vX2ludGVybWVkaW9fOTMgJT4lIHNlbGVjdChhbmlvLCBjb2VmX3RlY185M19pbmRleCkpICU+JSANCiAgbXV0YXRlKGNvZWZfY2kgPSAxLSh2YV90b3QvdmJwX3RvdCkpDQpjaV9iYXNlID0gY29lZl9jb25zdW1vX2ludGVybWVkaW8kY29lZl9jaVtjb2VmX2NvbnN1bW9faW50ZXJtZWRpbyRhbmlvID09MjAwNF0NCg0KY29lZl9jb25zdW1vX2ludGVybWVkaW8gPC0gY29lZl9jb25zdW1vX2ludGVybWVkaW8gJT4lIA0KICBtdXRhdGUoY29lZl9jaSA9IGNhc2Vfd2hlbiggYW5pbyA8PSAyMDA0IH4gY29lZl90ZWNfOTNfaW5kZXggKiBjaV9iYXNlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IGNvZWZfY2kpKSAlPiUgDQogICAgICAgICAjIGNvZWZfY2kgPSBpbXB1dGVUUzo6bmEuaW50ZXJwb2xhdGlvbihjb2VmX2NpLCBvcHRpb24gPSAibGluZWFyIiApKSAlPiUgDQogIHNlbGVjdChhbmlvLCBjb2VmX2NpKQ0KY29lZl9jb25zdW1vX2ludGVybWVkaW8NCmBgYA0KDQojIyMgRXN0aW1hY2lvbmVzIHByb3BpYXMgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojdmFyaWFibGVzIHBhcmEgbGEgZXN0aW1hY2nDs24gDQpwcmVjaW9zX3lfY2FudGlkYWRlcyA8LSBwcm9kX21lcmdlX2NydWRvICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZF9jYW50X2NydWRvID0gdW5pZGFkLCBwcm9kX2NydWRvKSAlPiUNCiAgbGVmdF9qb2luKGV4cG9fcV9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWRfY2FudF9jcnVkbyA9dW5pZGFkLCBleHBvX2NydWRvKSkgJT4lIA0KICBsZWZ0X2pvaW4oZXhpc3RlbmNpYXNfcGV0cm9sZW8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRfY3J1ZG8gPSB1bmlkYWQsIGV4aXN0ZW5jaWFzX2NydWRvKSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QoZXhpc3RlbmNpYXNfY3J1ZG89MCApKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChleHBvX2NydWRvPTAgKSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX21pX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZF9wcmVjaW9fY3J1ZG8gPSB1bmlkYWQsIHByZWNpb19jcnVkb19tZG9pbnQpLCBieSA9ICJhbmlvIikgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWRfcHJlY2lvX2NydWRvID0gdW5pZGFkLCBwcmVjaW9fbWVfY3J1ZG8pLCBieSA9IGMoImFuaW8iLCAidW5pZGFkX3ByZWNpb19jcnVkbyIpKSAlPiUgDQogIGxlZnRfam9pbihwcm9kX21lcmdlX2dhc19NTUJUVSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWRfY2FudF9nYXM9IHVuaWRhZCxwcm9kX2dhcyksIGJ5ID0gImFuaW8iKSAlPiUNCiAgbGVmdF9qb2luKGV4cG9fcV9nYXNfTU1CVFUgJT4lIHNlbGVjdChhbmlvLCB1bmlkYWRfY2FudF9nYXM9IHVuaWRhZCwgZXhwb19nYXMpKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkX3ByZWNpb19nYXMgPSB1bmlkYWQsIHByZWNpb19leHRlcm5vX2dhcywgcHJlY2lvX2V4cG9ydGFjaW9uX2dhc19hciksIGJ5ID0gImFuaW8iKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9faW50ZXJub19nYXNfbW1idHVfdXNkICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICBwcmVjaW9fZ2FzX21kb2ludCkpICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHRjcCwgdGNjKSwgYnkgPSAiYW5pbyIpDQoNCndyaXRleGw6OndyaXRlX3hsc3gocHJlY2lvc195X2NhbnRpZGFkZXMsIHBhdGggPSAicmVzdWx0YWRvcy9hcmdlbnRpbmEvaW5zdW1vc19jcml0ZXJpb19jY25uLnhsc3giKQ0KDQojIyBDcml0ZXJpbyBDQ05OIA0KY3JpdGVyaW9fY2NubiA8LSBwcmVjaW9zX3lfY2FudGlkYWRlcyAlPiUgDQogIGxlZnRfam9pbihjb2VmX2NvbnN1bW9faW50ZXJtZWRpbywgYnkgPSJhbmlvIikgJT4lIA0KICBtdXRhdGUoY3J1ZG9fbWRvX2ludGVybm8gPSBwcm9kX2NydWRvIC0gZXhwb19jcnVkbywNCiAgICAgICAgIGV4cG9fZ2FzID0gcmVwbGFjZV9uYShleHBvX2dhcywgMCApLA0KICAgICAgICAgZ2FzX21kb19pbnRlcm5vID0gcHJvZF9nYXMgLSBleHBvX2dhcywNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgIA0KICAgICAgICAjIGNyaXRlcmlvIENDTk4NCiAgICAgICAgIHZicF90b3QgPSAoKGNydWRvX21kb19pbnRlcm5vKnByZWNpb19jcnVkb19tZG9pbnQrDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvX2NydWRvKnByZWNpb19tZV9jcnVkbw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2FzX21kb19pbnRlcm5vICogcHJlY2lvX2dhc19tZG9pbnQgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK2V4cG9fZ2FzKnByZWNpb19leHBvcnRhY2lvbl9nYXNfYXIgKSp0Y2MpLzEwXjYsDQogICAgICAgICB2YnBfZXh0ciA9dmJwX3RvdCooMS1zZXJ2aWNpb19zX2V4dHJhY2Npb24pLA0KICAgICAgICAgY2lfdG90ID0gdmJwX3RvdCAqY29lZl9jaSAsDQogICAgICAgICBjaV9leHRyID0gdmJwX2V4dHIgKiBjb2VmX2NpLA0KICAgICAgICB2YV90b3Q9ICAgdmJwX3RvdCAtIGNpX3RvdCwNCiAgICAgICAgdmFfZXh0cj0gICB2YnBfZXh0ciAtIGNpX2V4dHIsDQogICAgICAgIG1zX2V4dHIgPSB2YnBfZXh0ciAqIG1lYW5fY29lZl9tcyRjb2VmX21zX2V4dHIsDQogICAgICAgICBtc190b3QgPSB2YnBfdG90ICogbWVhbl9jb2VmX21zJGNvZWZfbXNfdG90LA0KICAgICAgICAgZWJlX3RvdCA9IHZhX3RvdCAtIG1zX3RvdCwNCiAgICAgICAgIGViZV9leHRyPXZhX2V4dHIgLSBtc190b3QgICwNCiAgICAgICAgZnVlbnRlID0gIkNyaXRlcmlvIENDTk4iKQ0KY3JpdGVyaW9fY2Nubg0KDQoNCiMgRW1wYWxtZSBDQ05ODQppbmRpY2VfdmJwX2NyaXRlcmlvX2Njbm4gPC0gY3JpdGVyaW9fY2NubiAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSh2YnBfY3JpdGVyaW9fY2Nubl8wNCA9IGdlbmVyYXJfaW5kaWNlKHZicF90b3QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhID0gYW5pbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGFfYmFzZSA9IDIwMDQpICkgJT4lICMgLA0KICAgICAgICAgIyB2YnBfY3JpdGVyaW9fY2Nubl8xMiA9IGdlbmVyYXJfaW5kaWNlKHZicF90b3QsDQogICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGEgPSBhbmlvLA0KICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhX2Jhc2UgPSAyMDEyKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdmJwX2NyaXRlcmlvX2Njbm5fMDQpDQoNCmVtcGFsbWVfY2NubiA8LSBjY25uX29maWNpYWwgJT4lIA0KICBmdWxsX2pvaW4oY29lZl9jb25zdW1vX2ludGVybWVkaW8sIGJ5ID0gImFuaW8iKSAlPiUgDQogIGZ1bGxfam9pbihpbmRpY2VfdmJwX2NyaXRlcmlvX2Njbm4sIGJ5ID0gImFuaW8iKSAlPiUgDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICBtdXRhdGUodmJwX2V4dHIgPSBjYXNlX3doZW4oYW5pbyA8IDIwMDQgfiBjY25uX29maWNpYWwkdmJwX2V4dHJbY2Nubl9vZmljaWFsJGFuaW8gPT0gMjAwNF0gKiB2YnBfY3JpdGVyaW9fY2Nubl8wNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB2YnBfZXh0cikgLA0KICAgIHZicF90b3QgPSBjYXNlX3doZW4oIGFuaW8gPCAyMDA0IH4gY2Nubl9vZmljaWFsJHZicF90b3RbY2Nubl9vZmljaWFsJGFuaW8gPT0gMjAwNF0gKiB2YnBfY3JpdGVyaW9fY2Nubl8wNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB2YnBfdG90KSwNCiAgICBjaV9leHRyID0gdmJwX2V4dHIgKiBjb2VmX2NpICwNCiAgICBjaV90b3QgPSB2YnBfdG90ICpjb2VmX2NpICAgLA0KICAgIHZhX3RvdCA9IGNhc2Vfd2hlbihpcy5uYSh2YV90b3QpIH4gdmJwX3RvdCAtIGNpX3RvdCAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB2YV90b3QpLA0KICAgIHZhX2V4dHIgPSBjYXNlX3doZW4oaXMubmEodmFfZXh0cikgfiB2YnBfZXh0ciAtIGNpX2V4dHIgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdmFfZXh0ciksDQogICAgbXNfdG90ID0gY2FzZV93aGVuKGlzLm5hKG1zX3RvdCkgfiB2YnBfdG90Km1lYW5fY29lZl9tcyRjb2VmX21zX3RvdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IG1zX3RvdCkgLA0KICAgIG1zX2V4dHIgPSBjYXNlX3doZW4oaXMubmEobXNfZXh0cikgfiB2YnBfdG90Km1lYW5fY29lZl9tcyRjb2VmX21zX2V4dHIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBtc19leHRyKSwgDQogICAgZWJlX3RvdCA9IGNhc2Vfd2hlbihpcy5uYShlYmVfdG90KSB+IHZhX3RvdCAtbXNfdG90LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gZWJlX3RvdCksDQogICAgZWJlX2V4dHIgPSBjYXNlX3doZW4oaXMubmEoZWJlX2V4dHIpIH4gdmFfdG90IC1tc190b3QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBlYmVfZXh0ciksDQogICAgZnVlbnRlID0gIkVtcGFsbWUgQ0NOTiIpDQoNCiMjIENyaXRlcmlvIHByb3BpbyANCmNyaXRlcmlvX3Byb3BpbyA8LSBwcmVjaW9zX3lfY2FudGlkYWRlcyAlPiUNCiAgbGVmdF9qb2luKGVtcGFsbWVfY2NubiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLHVuaWRhZCwgY2lfdG90LCBjaV9leHRyLCBtc190b3QsIG1zX2V4dHIgKSApICU+JSANCiAgbGVmdF9qb2luKHN0b2NrX2VzdGltYWRvICU+JQ0KICAgICAgICAgICAgICAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JQ0KICAgICAgICAgICAgICAjIGZpbHRlcih2YXJpYWJsZSA9PSAicHB5ZV9lc3RpbWFkb19ib2xzYXIiKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShjb25zdW1vX2tfZmlqbyA9IHZhbG9yICogaXBjXzE4ICogY29uc3Vtb19rX2Zpam9feXBmKSAlPiUgDQogICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgY29uc3Vtb19rX2Zpam8pKSAlPiUgDQogIG11dGF0ZSgNCiAgICAgICAgIyBjcml0ZXJpbyBwcm9waW8NCiAgICAgICAgIHZicF90b3QgPSggKHByb2RfY3J1ZG8qcHJlY2lvX21lX2NydWRvICArIHByb2RfZ2FzICogcHJlY2lvX2V4dGVybm9fZ2FzKSAqIHRjcCkvMTBeNiwNCiAgICAgICAgIHZhX3RvdCA9IHZicF90b3QgLSBjaV9leHRyLA0KICAgICAgICAgZWJlX3RvdCA9IHZhX3RvdCAtIG1zX2V4dHIgLA0KICAgICAgICAgcHYgPSBlYmVfdG90IC0gY29uc3Vtb19rX2Zpam8gLSAodmJwX3RvdCAqIGltcF9wcm9tXzk3KSwgDQogICAgICAgICB2YnBfZXh0ciA9ICBOQSAsDQogICAgICAgICBlYmVfZXh0ciA9TkEsDQogICAgICAgICB2YV9leHRyPU5BLCANCiAgICAgICAgIGZ1ZW50ZSA9ICJDcml0ZXJpbyBwcm9waW8iKQ0KDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpmaWx0cm8gPC0gYygiYW5pbyIsICJ1bmlkYWQiLCAiZnVlbnRlIiwgInZicF90b3QiLCAidmJwX2V4dHIiLA0KICAgICAgICAgICAgImNpX3RvdCIsICJjaV9leHRyIiwgICJtc190b3QiLCAibXNfZXh0ciIsDQogICAgICAgICAgICAidmFfdG90IiwgICJ2YV9leHRyIiAsICJlYmVfdG90IiwgImViZV9leHRyIiAgKQ0KDQp2YWxvcl90b3RhbF9wcm9kdWNjaW9uX2NvcnIgPC0gY2Nubl9vZmljaWFsICU+JSANCiAgc2VsZWN0KGZpbHRybykgJT4lIA0KICByYmluZChjcml0ZXJpb19jY25uICU+JXNlbGVjdChmaWx0cm8pKSAlPiUgDQogIHJiaW5kKGVtcGFsbWVfY2NubiAlPiUgc2VsZWN0KGZpbHRybykpICU+JSANCiAgcmJpbmQoY3JpdGVyaW9fcHJvcGlvICU+JSBzZWxlY3QoZmlsdHJvKSkgJT4lIA0KICBnYXRoZXIoa2V5ID0gdmFyaWFibGUsIHZhbHVlPXZhbG9yLCA0OjEyKSANCg0KdmFsb3JfdG90YWxfcHJvZHVjY2lvbiA8LSAgdmFsb3JfdG90YWxfcHJvZHVjY2lvbl9jb3JyICU+JSANCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JQ0KICBtdXRhdGUodmFsb3IgPSB2YWxvciAvaXBjXzE4LA0KICAgICAgICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiKQ0KDQoNCiAgDQoNCmdyYWZfdmFsb3JfcHJvZHVjY2lvbiA8LSB2YWxvcl90b3RhbF9wcm9kdWNjaW9uICU+JSANCiAgZmlsdGVyKGFuaW8gPiAxOTYwKSAlPiUgDQogIGdncGxvdCggYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IGZ1ZW50ZSkpKw0KICBnZW9tX2xpbmUoYWxwaGEgPSAwLjcpKw0KICBnZW9tX3BvaW50KHNpemUgPSAwLjQzNSwgYWxwaGEgPSAwLjIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJWYWxvciBkZSBsYSBQcm9kdWNjacOzbiBoaWRyb2NhcmJ1csOtZmVyYSIsIA0KICAgICAgIHN1YnRpdGxlID0gIlZhbG9yIHRvdGFsIHkgY29tcG9uZW50ZXMiLA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpKw0KICBmYWNldF93cmFwKH52YXJpYWJsZSkNCmdwIDwtIGdncGxvdGx5KGdyYWZfdmFsb3JfcHJvZHVjY2lvbiwgd2lkdGggPSA3NTAsIGhlaWdodCA9IDgwMCkgIA0KZ3BbWyd4J11dW1snbGF5b3V0J11dW1snYW5ub3RhdGlvbnMnXV1bWzJdXVtbJ3gnXV0gPC0gLTAuMTENCmdwICU+JSBsYXlvdXQobWFyZ2luID0gbGlzdChsID0gNzUpKQ0KDQoNCmBgYA0KDQoNCg0KDQojIFRhc2EgZGUgR2FuYW5jaWENCg0KDQokJFRHX3toaWRyb2NhcmJ1cm9zfSA9IFxmcmFje1BWX3toaWRyb2NhcmJ1csOtZmVyYX19e0tUQV97aGlkcm9jYXJidXLDrWZlcm99fSQkDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiNsZXZhbnRvIGRhdGEgc2V0cyBkZSBvdHJvIFIgbWFya2Rvd24NCmJhbGFuY2VzX2FyZyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvQmFsYW5jZXMvZ2FzIHkgcGV0cm9sZW9fZGF0b3MvZGF0b3Nfci9yZXN1bHRhZG9zL2JhbGFuY2VzX2FyZy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKGZlY2hhID0gY29sX2RhdGUoZm9ybWF0ID0gIiVZLSVtLSVkIiksIFgxID0gY29sX3NraXAoKSkpDQoNCnBldHJvYnJhc19hcmdfc2VnbWVudG9zIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9CYWxhbmNlcy9nYXMgeSBwZXRyb2xlb19kYXRvcy9kYXRvc19yL3Jlc3VsdGFkb3MvcGV0cm9icmFzX2FyZ19zZWdtZW50b3MuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhYMSA9IGNvbF9za2lwKCkpKQ0KDQp5cGZfc2VnbWVudG9zIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9CYWxhbmNlcy9nYXMgeSBwZXRyb2xlb19kYXRvcy9kYXRvc19yL3Jlc3VsdGFkb3MveXBmX3NlZ21lbnRvcy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpDQoNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpncmFmX3RnX2VtcCA8LSBiYWxhbmNlc19hcmcgJT4lDQogIGZpbHRlcih0Z19hbnQgIT0gSW5mKSAlPiUgDQogIGdncGxvdChhZXMoZmVjaGEsIHRnX2FudCwgY29sb3IgPSBlbXByZXNhKSkrIA0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSsNCiAgbGFicyh0aXRsZSA9ICJUYXNhIGRlIGdhbmFuY2lhIGVtcHJlc2FzIGhpZHJvY2FyYnVyb3MiLA0KICAgICAgIHN1YnRpdGxlID0gICJBbnRlcyBkZSBpbXB1ZXN0b3MiKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpKw0KICBmYWNldF93cmFwKH5zZWN0b3IpDQoNCmdncGxvdGx5KGdyYWZfdGdfZW1wLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpncmFmX3RnX3lwZiA8LSB5cGZfc2VnICU+JSANCiAgIyBmaWx0ZXIoc2VjdG9yICVpbiUgYygicXVpbWljYSIsICJkb3duc3RyZWFtIiwgInVwc3RyZWFtIikpICU+JQ0KICBmaWx0ZXIoc2VjdG9yICE9ICJhZG1fY2VudHJhbCIpICU+JQ0KICBnZ3Bsb3QoYWVzKGZlY2hhLCB0Z19hY3Rpdm8sIGNvbG9yID0gc2VjdG9yKSkrIA0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICAjIGZhY2V0X3dyYXAofnNlY3RvcikrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkrDQogIGxhYnModGl0bGUgPSAiVGFzYSBkZSBnYW5hbmNpYSBkZSBzZWdtZW50b3MgWVBGIikNCmdyYWZfdGdfeXBmDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ3JhZl90Z19wZXRyb2JyYXMgPC0gcGV0cm9icmFzX2FyX3NlZyAlPiUgDQogIGZpbHRlcihzZWN0b3IgJWluJSBjKCJwZXRyb3F1aW1pY2EiLCAiZG93bnN0cmVhbSIsICJ1cHN0cmVhbSIsICJnYXNfeV9lbmVyZ2lhIikpICU+JQ0KICAjIGZpbHRlcihzZWN0b3IgIT0gImFkbV9jZW50cmFsIikgJT4lDQogIGdncGxvdChhZXMoZmVjaGEsIHRnLCBjb2xvciA9IHNlY3RvcikpKw0KICBnZW9tX2xpbmUoKSsNCiAgIyBmYWNldF93cmFwKH5zZWN0b3IpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpKw0KICBsYWJzKHRpdGxlID0gIlRhc2EgZGUgZ2FuYW5jaWEgZGUgc2VnbWVudG9zIFBldHJvYnJhcyBBcmdlbnRpbmEiKQ0KZ3JhZl90Z19wZXRyb2JyYXMNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UgICAsZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTV9DQojRXN0aW1hY2nDs24gZGUgdGFzYSBkZSBnYW5hbmNpYSB0b3RhbCByYW1hDQoNCnRhc2FfZ2FuYW5jaWFfcmFtYV9mbHVqbyA8LSBjcml0ZXJpb19wcm9waW8gJT4lDQogICAgZmlsdGVyKGFuaW8gPjE5OTcpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHYpICU+JSANCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAsIGJ5ID0gImFuaW8iKSAlPiUgDQogIG11dGF0ZShwdiA9IHB2IC9pcGNfMTgsDQogICAgICAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpICU+JSANCiAgIyBsZWZ0X2pvaW4oc3RvY2tfeV9wb3pvcyAlPiUgDQogICMgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICBwcHllID0gcHB5ZV9lc3RpbWFkbywgc3RvY2tfc2VsZWNjaW9uYWRvID0gZnVlbnRlX3BweWUsIGZ1ZW50ZV9wb3pvKSwNCiAgIyAgICAgICAgICAgYnkgPSBjKCJhbmlvIikpICU+JSANCiAgbGVmdF9qb2luKHN0b2NrX2VzdGltYWRvICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGZ1ZW50ZV9wb3pvID0gIkVzdGltYWNpw7NuIHNpbiBwb3pvcyIpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICBwcHllID0gdmFsb3IsIHN0b2NrX3NlbGVjY2lvbmFkbyA9IGZ1ZW50ZV9wcHllLCBmdWVudGVfcG96byksDQogICAgICAgICAgICBieSA9IGMoImFuaW8iKSkgJT4lIA0KICBtdXRhdGUodGFzYV9nYW5hbmNpYSA9IHB2L3BweWUpDQoNCmdyYWZfdGdfcmFtYV8xIDwtIHRhc2FfZ2FuYW5jaWFfcmFtYV9mbHVqbyAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdGFzYV9nYW5hbmNpYSwgY29sb3IgPWZ1ZW50ZV9wb3pvICkpKw0KICBnZW9tX2xpbmUoYWxwaGEgPSAwLjUpKw0KICBnZW9tX3BvaW50KCkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlRhc2EgZGUgZ2FuYW5jaWEgaGlkcm9jYXJidXLDrWZlcmEgY29uIFBQeUUgZGUgZXh0cmFjY2nDs24iKSAjKw0KICAjIGZhY2V0X3dyYXAofnN0b2NrX3NlbGVjY2lvbmFkbykNCiMgZ2dwbG90bHkoZ3JhZl90Z19yYW1hXzEsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA2MDApDQpncmFmX3RnX3JhbWFfMQ0KDQojIyMjIyMjIyMjIyMNCg0KIyAjZWwgREYgdGFzYV9nYW5hbmNpYV9yYW1hX3N0b2NrIGNvbnRpZW5lIGxhcyBlc3RpbWFjaW9uZXMgZGlzdGludGFzIGVzdGltYWNpb25lcyBkZSBLVEEgY29uIHN0b2NrIGRlIHBvem9zIA0KIyB0YXNhX2dhbmFuY2lhX3JhbWFfc3RvY2sgPC0gdmFsb3JfdG90YWxfcHJvZHVjY2lvbiAlPiUNCiMgICBmaWx0ZXIodmFyaWFibGUgPT0gImV4Y2VkZW50ZV9icnV0b19leHBsb3RhY2lvbiIgJiBmdWVudGUgPT0gIkNyaXRlcmlvIHByb3BpbyBjb24gVkJQIENDTk4iICkgJT4lIA0KIyAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV4Y2VkZW50ZV9icnV0b19leHBsb3RhY2lvbiA9IHZhbG9yKSAlPiUgDQojICAgbGVmdF9qb2luKHN0b2NrX2VzdGltYWRvICU+JSANCiMgICAgICAgICAgICAgICAjIGZpbHRlcih2YXJpYWJsZSAlaW4lIGMoInBweWVfZXN0aW1hZG9fYWZpcCIsICJwcHllX2VzdGltYWRvX2JvbHNhciIsDQojICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICJwcHllX2VzdGltYWRvX3RvdGFsIikpICU+JQ0KIyAgICAgICAgICAgICAgICMgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllX2VzdGltYWRvX2JvbHNhciIpICU+JQ0KIyAgICAgICAgICAgICAgICMgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllX2VzdGltYWRvX3RvdGFsIikgJT4lDQojICAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgIHBweWUgPSB2YWxvciwgc3RvY2tfc2VsZWNjaW9uYWRvID0gZnVlbnRlX3BweWUpICU+JSANCiMgICAgICAgICAgICAgICBtdXRhdGUodW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiKSkgJT4lIA0KIyAgIG11dGF0ZSh0YXNhX2dhbmFuY2lhID0gZXhjZWRlbnRlX2JydXRvX2V4cGxvdGFjaW9uL3BweWUpDQojIA0KIyBncmFmX3RnX3JhbWFfMiA8LSB0YXNhX2dhbmFuY2lhX3JhbWFfc3RvY2sgJT4lIA0KIyAgIGZpbHRlcihhbmlvID4xOTYwKSAlPiUgDQojICAgZ2dwbG90KGFlcyhhbmlvLCB0YXNhX2dhbmFuY2lhLCBjb2xvciA9IHN0b2NrX3NlbGVjY2lvbmFkbykpKw0KIyAgIGdlb21fbGluZShhbHBoYSA9IDAuNSkrDQojICAgZ2VvbV9wb2ludCgpKw0KIyAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpKw0KIyAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLA0KIyAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiMgICBsYWJzKHRpdGxlID0gIlRhc2EgZGUgZ2FuYW5jaWEgaGlkcm9jYXJidXLDrWZlcmEgY29uIFBQeUUgYSBwYXJ0aXIgZGUgc3RvY2sgZGUgcG96b3MgKDE5NjAgLSAyMDE4KSIpDQojICMgZ2dwbG90bHkoZ3JhZl90Z19yYW1hXzIsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA2MDApDQojIGdyYWZfdGdfcmFtYV8yDQoNCmBgYA0KDQojIyBSZW50YSBhcHJvcGlhZGEgcG9yIGxhcyBlbXByZXNhcyBkZSBsYSByYW1hDQoNCkxhIHJlbnRhIGFwcm9waWFkYSBwb3IgbGFzIGVtcHJlc2FzIGRlIGxhIHJhbWEgc2UgY2FsY3VsYSBwb3IgbWVkaW8gZGVsIGRpZmVyZW5jaWFsIGRlIHRhc2FzIGRlIGdhbmFuY2lhIGVudHJlIGVsIHNlY3RvciBoaWRyb2NhcmJ1csOtZmVybyBxdWUgc3VyZ2UgYSBwYXJ0aXIgZGUgbG9zIGJhbGFuY2VzIHkgbGEgcmVudGFiaWxpZGFkIG5vcm1hbCBkZSBsYSBlY29ub23DrWEuDQoNCiQkUmVudGFcX2VtcHJlc2FzID0gS1RBX3toaWRyb2NhcmJ1csOtZmVyb30gKiAoVEdfe2hpZHJvY2FyYnVyw61mZXJhfSAtIFRHX3tyZWZlcmVuY2lhfSkkJA0KJCRUR197aGlkcm9jYXJidXLDrWZlcmF9ID0gXGZyYWN7R2NpYV97aGlkcm9jYXJidXJvc319e0tUQV97aGlkcm9jYXJidXLDrWZlcm99fSQkIA0KUG9yIGxvIGN1YWwsIGxhIHJlbnRhIGFwcm9waWFkYSBwb3IgbGFzIGVtcHJlc2FzIGRlIGxhIHJhbWEgc2Vyw61hIGVxdWl2YWxlbnRlIGE6DQoNCiQkUmVudGFcX2VtcHJlc2FzID0gR2NpYV97aGlkcm9jYXJidXJvc30gLSBLVEFfe2hpZHJvY2FyYnVyw61mZXJvfSAqICBUR197cmVmZXJlbmNpYX0kJA0KDQpEb25kZToNCg0KKiAkS1RBX3toaWRyb2NhcmJ1csOtZmVyb30kID0gU3RvY2sgZGUgY2FwaXRhbCBhZGVsYW50YWRvIGRlIGVtcHJlc2FzIGhpZHJvY2FyYnVyw61mZXJhcw0KKiAkVEdfe2hpZHJvY2FyYnVyw61mZXJhfSQgPSBUYXNhIGRlIGdhbmFuY2lhIGRlIGVtcHJlc2FzIGhpZHJvY2FyYnVyw61mZXJhcw0KKiAkVEdfe3JlZmVyZW5jaWF9JCA9IFRhc2EgZGUgZ2FuYW5jaWEgZGUgcmVmZXJlbmNpYQ0KKiAkR2NpYV97aGlkcm9jYXJidXJvc30kID0gR2FuYW5jaWEgZGUgZW1wcmVzYXMgaGlkcm9jYXJidXLDrWZlcmFzDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiAgDQp0Z19pbmR1c3RyaWFsIDwtIHJlYWRfZGVsaW0oIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvVEcvdGdfaW5kdXN0cmlhbC5jc3YiLCANCiAgICAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpICU+JSANCiAgbXV0YXRlKGFuaW8gPSBhcy5kb3VibGUoYW5pbykpDQoNCnJlbnRhX3RnIDwtICB0YXNhX2dhbmFuY2lhX3JhbWFfZmx1am8gJT4lDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHN0b2NrX3NlbGVjY2lvbmFkbywgZnVlbnRlX3Bvem8sIHBweWUgLCB0YXNhX2dhbmFuY2lhKSAlPiUgDQogICMgZmlsdGVyKHN0b2NrX3NlbGVjY2lvbmFkbyA9PSAicHB5ZV9ib2xzYXIiLGZ1ZW50ZV9wb3pvID09ICJwb3pvc19jYXJnYWRvc19zZWNfZW5lcmdpYSIgKSAlPiUgDQogIGxlZnRfam9pbih0Z19pbmR1c3RyaWFsLCBieSA9ICJhbmlvIikgJT4lIA0KICByZW5hbWUodGdfaGlkcm9jYXJidXJvcyA9IHRhc2FfZ2FuYW5jaWEpICU+JSANCiAgbXV0YXRlKHJlbnRhX2Nvbl90Z19qaWMgPSBwcHllICoodGdfaGlkcm9jYXJidXJvcyAtIHRnX2luZHVfamljKSwNCiAgICAgICAgIHJlbnRhX2Nvbl90Z19lbSA9IHBweWUgKih0Z19oaWRyb2NhcmJ1cm9zIC0gdGdfaW5kdV9lbSksDQogICAgICAgICB1bmlvbl90ZyA9IGNhc2Vfd2hlbihhbmlvIDwgMTk5MyB+IHRnX2luZHVfamljLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+PSAxOTkzIH4gdGdfaW5kdV9lbSkpICU+JSANCiAgZGlzdGluY3QoKQ0KDQpncmFmX3RnX3JhbWEgPC0gcmVudGFfdGcgJT4lDQogIGdhdGhlcihrZXkgPSB0aXBvX3JlbnRhLA0KICAgICAgICAgdmFsdWUgPSByZW50YSwNCiAgICAgICAgIDk6MTApICU+JSANCiAgZmlsdGVyKGFuaW8gPjE5NjApICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCByZW50YSwgZmlsbCA9IHRpcG9fcmVudGEpKSsgDQogIGdlb21fY29sKHBvc2l0aW9uID0iZG9kZ2UiKSsNCiAgIyBnZW9tX3BvaW50KCkrDQogIGxhYnModGl0bGUgPSAiUmVudGEgaGlkcm9jYXJidXLDrWZlcmEgcG9yIGRpZmVyZW5jaWFsIGRlIHRhc2FzIGRlIGdhbmFuY2lhIiwNCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpDQpnZ3Bsb3RseShncmFmX3RnX3JhbWEsIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpyZW50YV9lbXByZXNhc19iYWxhbmNlcyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvQmFsYW5jZXMvZ2FzIHkgcGV0cm9sZW9fZGF0b3MvZGF0b3Nfci9yZXN1bHRhZG9zL3JlbnRhX2VtcHJlc2EuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhYMSA9IGNvbF9za2lwKCkpKSANCg0KcmVudGFfcHJvZHVjY2lvbl9iYWxhbmNlcyA8LSAgcmVudGFfZW1wcmVzYXNfYmFsYW5jZXMgJT4lIA0KICBmaWx0ZXIoIShlbXByZXNhICVpbiUgYygiY2hldnJvbl9nbG9iYWwiLCAicGV0cm9icmFzX2dsb2JhbCIgKSksDQogICAgICAgICBzZWN0b3IgJWluJSBjKCAiaW50ZWdyYWRhIiwgInByb2R1Y2Npb24iKQ0KICAgICAgICAgKSAlPiUgDQogIGdyb3VwX2J5KGZlY2hhLCB1bmlkYWQpICU+JSANCiAgc3VtbWFyaXNlKEtUQSA9IHN1bShLVEEsIG5hLnJtID0gVCksDQogICAgICAgICAgICBnYW5hbmNpYV9lbXByZXNhc19hbnRlc19pbXB1ZXN0b3MgPSBzdW0oZ2NpYV9hbnQsIG5hLnJtID0gVCksDQogICAgICAgICAgICBnYW5hbmNpYV9lbXByZXNhc19kZXNwX2ltcHVlc3RvcyA9IHN1bShnY2lhX2Rlc3AsIG5hLnJtID0gVCksDQogICAgICAgICAgICByZW50YV9lbXByZXNhc19hbnRlc19pbXB1ZXN0b3MgPSBzdW0ocmVudGFfYW50X2NvcnIsIG5hLnJtID0gVCksDQogICAgICAgICAgICByZW50YV9lbXByZXNhc19kZXNwX2ltcHVlc3RvcyA9IHN1bShyZW50YV9kZXNwX2NvcnIsIG5hLnJtID0gVCkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKCBhbmlvID0gbHVicmlkYXRlOjp5ZWFyKGZlY2hhKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgZXZlcnl0aGluZyguKSwgLWZlY2hhKQ0KDQpncmFmX3JlbnRhX2VtcCA8LSByZW50YV9lbXByZXNhc19iYWxhbmNlcyAlPiUNCiAgZmlsdGVyKHNlY3RvciAhPSAiZGlzdHJpYnVjaW9uIikgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHJlbnRhX2Rlc3BfcDE4KSwNCiAgICAgICAgICEoZW1wcmVzYSAlaW4lIGMoImNoZXZyb25fZ2xvYmFsIiwgInBldHJvYnJhc19nbG9iYWwiICkpKSAlPiUgDQogIGdncGxvdChhZXMoZmVjaGEsIHJlbnRhX2Rlc3BfcDE4LCBmaWxsID0gZW1wcmVzYSkpICsgDQogIGdlb21fY29sKHBvc2l0aW9uID0gInN0YWNrIikrDQogIGxhYnModGl0bGUgPSAiUmVudGEgaGlkcm9jYXJidXLDrWZlcmEgcG9yIGVtcHJlc2EiLA0KICAgICAgIHN1YnRpdGxlID0gIk1pbGxvbmVzIGRlIHBlc29zIGNvcnJpZW50ZXMiKSsNCiAgZmFjZXRfd3JhcCh+c2VjdG9yKQ0KDQpnZ3Bsb3RseShncmFmX3JlbnRhX2VtcCwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCg0KYGBgDQoNCg0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQplamVyY2ljaW8gPC0gdmFsb3JfdG90YWxfcHJvZHVjY2lvbiAlPiUgDQogIGZpbHRlcih2YXJpYWJsZSA9PSAidmFfdG90IikgJT4lIA0KICAjIGZ1bGxfam9pbihzdG9ja19yYW1hICU+JQ0KICAjICAgICAgICAgICAgIHNlbGVjdChhbmlvLCByYW1hID0gc2VjdG9yLCBhY3Rpdm9zID0gdmFyaWFibGUsIHZhbG9yX2FjdGl2b3MgPSB2YWxvciwgDQogICMgICAgICAgICAgICAgICAgICAgIGZ1ZW50ZV9hY3Rpdm9zID0gZnVlbnRlKSAlPiUgDQogICMgICAgICAgICAgICAgIyBmaWx0ZXIoZnVlbnRlX2FjdGl2b3MgPT0gIkFGSVAiKSklPiUNCiAgIyAgICAgICAgICAgICBmaWx0ZXIoZnVlbnRlX2FjdGl2b3MgPT0gIkJvbHNhciIpKSU+JQ0KICBmdWxsX2pvaW4oc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMgJT4lDQogICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihlbXByZXNhID09ICJZUEYiKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCByYW1hID0gc2VjdG9yLCBhY3Rpdm9zID0gdmFyaWFibGUsIHZhbG9yX2FjdGl2b3MgPSB2YWxvcikpICU+JSANCiAgICAgICAgICAgICAgIyBmaWx0ZXIoZnVlbnRlX2FjdGl2b3MgPT0gIkJvbHNhciIpKSU+JQ0KICBtdXRhdGUocmVsYWNpb24gPSB2YWxvcl9hY3Rpdm9zL3ZhbG9yKSAlPiUgDQogIGZpbHRlcihhbmlvID4gMTk5MCwgIShpcy5uYShhY3Rpdm9zKSkpDQplamVyY2ljaW8gICAgICAgICAgICANCiAgDQpncmFmX3JlbGFjaW9uIDwtIGVqZXJjaWNpbyAlPiUgDQogICMgZ2dwbG90KCBhZXMoYW5pbywgcmVsYWNpb24sIGNvbG9yID0gcmFtYSkpKw0KICBnZ3Bsb3QoIGFlcyhhbmlvLCByZWxhY2lvbiwgY29sb3IgPSBmdWVudGUpKSsNCiAgIyBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJBY3Rpdm8gc29icmUgdmFsb3IgYWdyZWdhZG8iKSsNCiAgZmFjZXRfd3JhcCh+YWN0aXZvcykgDQoNCiAgZ2dwbG90bHkoZ3JhZl9yZWxhY2lvbiwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCg0KDQpgYGANCg0KDQoNCiMgUmVudGEgcG9yIGVsIGRpZmVyZW5jaWFsIGRlIHByZWNpb3MgZW50cmUgZWwgbWVyY2FkbyBpbnRlcm5vIHkgbGFzIHJlZmVyZW5jaWFzIGludGVybmFjaW9uYWxlcyANCg0KUmVudGEgYXByb3BpYWRhIG1lZGlhbnRlIGVsIGFiYXJhdGFtaWVudG8gZW4gZWwgY29uc3VtbyBpbnRlcm5vIHBvciBlZmVjdG8gZGVsIGRpZmVyZW5jaWFsIGRlIHByZWNpb3MgaW50ZXJuby9leHRlcm5vLCBzb2JyZXZhbHVhY2nDs24gZGUgbGEgbW9uZWRhIHkgcmV0ZW5jaW9uZXMgYSBsYSBleHBvcnRhY2nDs24NCg0KDQojIyMgQ3JpdGVyaW8gZGUgY8OzbXB1dG8gZGUgSksgKHZhcmlhYmxlICdyZW50YV9kaWZfcHJlY2lvcycpDQoNCiQkUkRQPSBQcm9kSW50ICogUGV4dCAqIFRDUCAtIFByb2RJbnQgKiBQTUkgKiBUQ0MkJA0KDQpEb25kZToNCg0KKiAkUkRQJCA9IFJlbnRhIGFwcm9waWFkYSBwb3IgZWZlY3RvIGRpZmVyZW5jaWFsIGRlIHByZWNpb3MgaW50ZXJuby9leHRlcm5vIHkgc29icmV2YWx1YWNpw7NuDQoqICRNZG9JbnQkID0gUHJvZHVjY2nDs24gZGVzdGluYWRhIGFsIE1lcmNhZG8gSW50ZXJubzogUHJvZHVjY2nDs24gLSBFeHBvcnRhY2lvbmVzIC0gRXhpc3RlbmNpYXMgKGJhcnJpbGVzIGRlIHBldHLDs2xlbyDDsyBNTUJUVSkNCiogJFBleHQkID0gUHJlY2lvIGRlIHJlZmVyZW5jaWEgZGVsIG1lcmNhZG8gZXh0ZXJubyAoVVNEKQ0KKiAkUE1JJCA9IFByZWNpbyBkZSB2ZW50YSBkZWwgbWVyY2FkbyBpbnRlcm5vIChVU0QpDQoqICRUQ1AkID0gVGlwbyBkZSBDYW1iaW8gZGUgUGFyaWRhZA0KKiAkVENDJCA9IFRpcG8gZGUgQ2FtYmlvIENvbWVyY2lhbA0KDQojIyMgQ3JpdGVyaW8gZGUgY8OzbXB1dG8gZGUgSklDIHkgY2lhICh2YXJpYWJsZSAncmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbicpDQokJFJEUCA9IE1kb0ludCAqIFBNSSAqIChcZnJhY3tUQ1B9e1RDQ30gIC0gMSkkJCAgDQoNCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCnJlbnRhX2RpZl9wcmVjaW9zX2NydWRvIDwtIHByb2RfbWVyZ2VfY3J1ZG8gJT4lIA0KICAjIGZpbHRlcihhbmlvID4gMTk5MCkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcm9kX2NydWRvKSAlPiUgDQogIGxlZnRfam9pbihleHBvX3FfY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLCBleHBvX2NydWRvKSkgJT4lICN1bmlvbiBjb24gZXhwbw0KICBsZWZ0X2pvaW4oZXhpc3RlbmNpYXNfcGV0cm9sZW8pICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGV4aXN0ZW5jaWFzX2NydWRvPTAgKSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QoZXhwb19jcnVkbz0wICkpICU+JSANCiAgIyBtdXRhdGUocHJvZF9tZG9faW50ZXJubyA9IHByb2RfY3J1ZG8gLSBleHBvX2NydWRvIC0gZXhpc3RlbmNpYXNfY3J1ZG8pICU+JSANCiAgbXV0YXRlKHByb2RfbWRvX2ludGVybm8gPSBwcm9kX2NydWRvIC0gZXhwb19jcnVkbyApICU+JSANCiAgbGVmdF9qb2luKHByZWNpb19taV9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBwcmVjaW9fY3J1ZG9fbWRvaW50KSwNCiAgICAgICAgICAgIGJ5ID0gYygiYW5pbyIpKSAlPiUgICMgdW5vIGNvbiBwcmVjaW8gaW50ZXJubw0KICBsZWZ0X2pvaW4ocHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbyAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShicmVudCA9IGNhc2Vfd2hlbihhbmlvIDwgMTk4NyB+IGJyZW50X2hpc3RvcmljLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+PSAxOTg3IH4gYnJlbnRfaWVhICkpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHByZWNpb19tZV9jcnVkbywgYnJlbnQgKSwNCiAgICAgICAgICAgIGJ5ID0gYygiYW5pbyIpKSAlPiUgICAjIHVubyBjb24gcHJlY2lvIGV4dGVybm8gDQogIGxlZnRfam9pbih0Y3BfYW51YWxfYiwgYnkgPSAiYW5pbyIpICU+JSANCiAgbXV0YXRlKHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvID0gcHJvZF9tZG9faW50ZXJubypwcmVjaW9fbWVfY3J1ZG8qdGNwIC0gcHJvZF9tZG9faW50ZXJubypwcmVjaW9fY3J1ZG9fbWRvaW50KnRjYywNCiAgICAgICAgIHJlbnRhX2RpZl9wcmVjaW9zX2JyZW50ID0gcHJvZF9tZG9faW50ZXJubypicmVudCp0Y3AgLSBwcm9kX21kb19pbnRlcm5vKnByZWNpb19jcnVkb19tZG9pbnQqdGNjLA0KICAgICAgICAgIyByZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uID0gcHJvZF9tZG9faW50ZXJubyAqcHJlY2lvX2NydWRvX21kb2ludCh0Y3AvdGNjLTEpLA0KICAgICAgICAgdW5pZGFkX3ByZWNpbyA9ICJVU0QiLCB1bmlkYWRfcmVudGEgPSAiUGVzb3MgY29ycmllbnRlcyIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZF9jYW50aWRhZD0gdW5pZGFkICwgcHJvZF9jcnVkbywgZXhwb19jcnVkbywgZXhpc3RlbmNpYXNfY3J1ZG8sIHByb2RfbWRvX2ludGVybm8sDQogICAgICAgICB1bmlkYWRfcHJlY2lvLCBwcmVjaW9faW50ZXJub19jcnVkbyA9IHByZWNpb19jcnVkb19tZG9pbnQsIHByZWNpb19leHRlcm5vX2NydWRvID0gcHJlY2lvX21lX2NydWRvLA0KICAgICAgICAgIHRjYywgdGNwLCB1bmlkYWRfcmVudGEsIA0KICAgICAgICAgIyByZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uX2NydWRvID0gcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbiwNCiAgICAgICAgIHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvLCByZW50YV9kaWZfcHJlY2lvc19icmVudCkgDQoNCg0KDQoNCmdyYWZfZGlmX2NydWRvIDwtIHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvICU+JQ0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lIA0KICBtdXRhdGUocmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gPSByZW50YV9kaWZfcHJlY2lvc19jcnVkby9pcGNfMTgsDQogICAgICAgICByZW50YV9kaWZfcHJlY2lvc19icmVudCA9IHJlbnRhX2RpZl9wcmVjaW9zX2JyZW50L2lwY18xOCkgJT4lIA0KICBmaWx0ZXIoYW5pbyA+MTk2MCkgJT4lIA0KICBzZWxlY3QoYW5pbywgMTI6bmNvbCguKSApICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fcmVudGEsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMzo0KSAlPiUgDQogIG11dGF0ZSh2YWxvciA9IHZhbG9yIC8gMTBeNikgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IHRpcG9fcmVudGEsIGZpbGwgPSB0aXBvX3JlbnRhKSkrDQogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBwZXRyb2xlcmEgcG9yIGRpZmVyZW5jaWFsIGRlIHByZWNpb3MgaW50ZXJubyB5IGV4dGVybm8iLA0KICAgICAgIHkgPSAiTU0gZGUgcGVzb3MgZGUgMjAxOCIpDQpncmFmX2RpZl9jcnVkbw0KDQoNCg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzIDwtIHByb2RfbWVyZ2VfZ2FzX01NQlRVICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJvZF9nYXMpICU+JSANCiAgbGVmdF9qb2luKGV4cG9fcV9nYXNfTU1CVFUgJT4lIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV4cG9fZ2FzKSkgJT4lIA0KICBtdXRhdGUoZXhwb19nYXMgPSByZXBsYWNlX25hKGV4cG9fZ2FzLCAwICksDQogICAgICAgIHByb2RfbWRvX2ludGVybm8gPSBwcm9kX2dhcyAtIGV4cG9fZ2FzKSAlPiUNCiAgbGVmdF9qb2luKHByZWNpb19taV9nYXNfTU1CVFUgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvICwgcHJlY2lvX2ludGVybm9fZ2FzID0gIHByZWNpb19nYXNfbWRvaW50KSwNCiAgICAgICAgICAgIGJ5ID0gImFuaW8iKSAlPiUgICMgdW5vIGNvbiBwcmVjaW8gaW50ZXJubw0KICBsZWZ0X2pvaW4ocHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcHJlY2lvX2V4dGVybm9fZ2FzKSwgDQogICAgICAgICAgICBieSA9ICJhbmlvIikgJT4lICAgIyB1bm8gY29uIHByZWNpbyBleHRlcm5vDQogIGxlZnRfam9pbih0Y3BfYW51YWxfYiwgYnkgPSAiYW5pbyIpICU+JQ0KICBtdXRhdGUoDQogICAgcHJlY2lvX2ludGVybm9fZ2FzID0gcHJlY2lvX2ludGVybm9fZ2FzLyB0Y2MsDQogICAgcmVudGFfZGlmX3ByZWNpb3NfZ2FzID0gcHJvZF9tZG9faW50ZXJubyAqIHRjcCAqIHByZWNpb19leHRlcm5vX2dhcw0KICAgICAgLSBwcm9kX21kb19pbnRlcm5vICogdGNjICogcHJlY2lvX2ludGVybm9fZ2FzICwNCiAgICByZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uID0gcHJvZF9tZG9faW50ZXJubyAqIHByZWNpb19pbnRlcm5vX2dhcyoodGNwL3RjYy0xKSwNCiAgICAgIHVuaWRhZF9wcmVjaW8gPSAiVVNEIiwgdW5pZGFkX3JlbnRhID0gIlBlc29zIGNvcnJpZW50ZXMiKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWRfY2FudGlkYWQ9IHVuaWRhZCAsIHByb2RfZ2FzLCBleHBvX2dhcywgcHJvZF9tZG9faW50ZXJubywgDQogICAgICAgICB1bmlkYWRfcHJlY2lvLCBwcmVjaW9faW50ZXJub19nYXMsIHByZWNpb19leHRlcm5vX2dhcywgdGNjLCB0Y3AsDQogICAgICAgICB1bmlkYWRfcmVudGEsIHJlbnRhX2RpZl9wcmVjaW9zX2dhcywgcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbl9nYXMgPSByZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uICkNCnJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzDQoNCg0KDQpncmFmX2RpZl9nYXMgPC0gcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lIA0KICBtdXRhdGUocmVudGFfZGlmX3ByZWNpb3NfZ2FzID0gcmVudGFfZGlmX3ByZWNpb3NfZ2FzL2lwY18xOCwNCiAgICAgICAgIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fZ2FzID0gDQogICAgICAgICAgIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fZ2FzL2lwY18xOCkgJT4lDQogICAgc2VsZWN0KGFuaW8sIDExOm5jb2woLikgKSAlPiUgDQogIGdhdGhlcihrZXkgPSB0aXBvX3JlbnRhLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDM6NCkgJT4lIA0KICBtdXRhdGUodmFsb3IgPSB2YWxvciAvIDEwXjYpICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSB0aXBvX3JlbnRhLCBmaWxsID0gdGlwb19yZW50YSkpKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiUmVudGEgZ2Fzw61mZXJhIHBvciBkaWZlcmVuY2lhbCBkZSBwcmVjaW9zIGludGVybm8geSBleHRlcm5vIiwNCiAgICAgICB5ID0gIk1NIGRlIHBlc29zIGRlIDIwMTgiKSsNCiAgeGxpbSgxOTYwLCAyMDIxKQ0KZ3JhZl9kaWZfZ2FzDQoNCg0KDQpgYGANCg0KIyBSZW50YSBhcHJvcGlhZGEgcG9yIHNvYnJldmFsdWFjacOzbiBjYW1iaWFyaWENCg0KDQokJFJzb2JyZXZhbHVhY2lvbiA9IEV4cG8gKiBQZXh0ICogKFRDUCAtIFRDQykkJCANCg0KRG9uZGU6DQoqICRSc29icmV2YWx1YWNpb24kID0gUmVudGEgYXByb3BpYWRhIHBvciBleHBvcnRhY2lvbmVzIGNvbiB0aXBvIGRlIGNhbWJpbyBzb2JyZXZhbHVhZG8NCiogJEV4cG8kID0gRXhwb3J0YWNpb25lcyAgKGJhcnJpbGVzIGRlIHBldHLDs2xlbyDDsyBNTUJUVSkNCiogJFBleHQkID0gUHJlY2lvIGRlIHJlZmVyZW5jaWEgZGVsIG1lcmNhZG8gZXh0ZXJubyAoVVNEKQ0KKiAkVENQJCA9IFRpcG8gZGUgQ2FtYmlvIGRlIFBhcmlkYWQNCiogJFRDQyQgPSBUaXBvIGRlIENhbWJpbyBDb21lcmNpYWwNCg0KYGBge3IgZWNobz1GQUxTRX0NCg0KcmVudGFfdGNwX2NydWRvIDwtICByZW50YV9kaWZfcHJlY2lvc19jcnVkbyAlPiUNCiAgbGVmdF9qb2luKGV4cG9fdXNkX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGV4cG9fY3J1ZG9fdXNkID0gZXhwb19jcnVkbywgdW5pZGFkX2V4cG8gPSB1bmlkYWQgKSkgJT4lIA0KICAgbXV0YXRlKHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvID0gZXhwb19jcnVkbypwcmVjaW9fZXh0ZXJub19jcnVkbyp0Y3AgLSBleHBvX2NydWRvKnByZWNpb19leHRlcm5vX2NydWRvKnRjYywNCiAgICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkb192YWxvciA9IGV4cG9fY3J1ZG9fdXNkKiB0Y3AgLSBleHBvX2NydWRvX3VzZCogdGNjLCANCiAgICAgICAgIHVuaWRhZF9wcmVjaW8gPSAiVVNEIiwgdW5pZGFkX3JlbnRhID0gIlBlc29zIGNvcnJpZW50ZXMiLA0KICAgICAgICAgZGlmID0gcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8vcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG9fdmFsb3ItMSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRpZGFkICwgZXhwb19jcnVkbywNCiAgICAgICAgIHVuaWRhZF9leHBvLCBleHBvX2NydWRvX3VzZCwNCiAgICAgICAgIHVuaWRhZF9wcmVjaW8sIHByZWNpb19leHRlcm5vX2NydWRvICwNCiAgICAgICAgICB0Y2MsIHRjcCwgdW5pZGFkX3JlbnRhLA0KICAgICAgICAgcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8sIHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvX3ZhbG9yLCBkaWYpICANCnJlbnRhX3RjcF9jcnVkbw0KDQpyZW50YV90Y3BfZ2FzIDwtICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcyAlPiUgDQogICBtdXRhdGUocmVudGFfc29icmV2YWx1YWNpb25fZ2FzID0gZXhwb19nYXMqcHJlY2lvX2V4dGVybm9fZ2FzKnRjcCAtIGV4cG9fZ2FzKnByZWNpb19leHRlcm5vX2dhcyp0Y2MsDQogICAgICAgICB1bmlkYWRfcHJlY2lvID0gIlVTRCIsIHVuaWRhZF9yZW50YSA9ICJQZXNvcyBjb3JyaWVudGVzIikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRpZGFkICwgZXhwb19nYXMsIA0KICAgICAgICAgdW5pZGFkX3ByZWNpbywgcHJlY2lvX2V4dGVybm9fZ2FzICwNCiAgICAgICAgICB0Y2MsIHRjcCwgdW5pZGFkX3JlbnRhLA0KICAgICAgICAgcmVudGFfc29icmV2YWx1YWNpb25fZ2FzKSAgDQoNCg0KDQpgYGANCg0KDQoNCiMgUmVudGEgYXByb3BpYWRhIHBvciBlbCBFc3RhZG8gbWVkaWFudGUgaW1wdWVzdG9zIGVzcGVjw61maWNvcw0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KDQpyZXRlbmNpb25lc19jYW1wb2RvbmljbyA8LSByZWFkX2V4Y2VsKCIvQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9kYXRhc2V0cy9yZXRlbmNpb25lcy54bHN4IiAsIA0KICAgIHNoZWV0ID0gInVzZCIpICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbCAlPiUgc2VsZWN0KC1UQ1ApKSAlPiUgDQogIG11dGF0ZShyZXRlbmNpb25lc19oYyA9IHJldGVuY2lvbmVzX2hnICogVENDICogMTAwMDAwMCwNCiAgICAgICAgIHVuaWRhZCA9ICJhcnMiKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHJldGVuY2lvbmVzX2hjKQ0KDQpyZXRlbmNpb25lc19jcnVkbyA8LSByZWFkX2V4Y2VsKCAiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvcmV0ZW5jaW9uZXMueGxzeCIgKSAlPiUNCiAgcmVuYW1lKHJldGVuY2lvbmVzX2NydWRvX2prID0gcmV0ZW5jaW9uZXNfamssDQogICAgICAgICByZXRlbmNpb25lc19jcnVkb19iZnIgPSAicmV0ZW5jaW9uZXNfYmZyX00kMjAwOCIpICU+JSANCiAgbXV0YXRlKHJldGVuY2lvbmVzX2NydWRvX2JmciA9IHJldGVuY2lvbmVzX2NydWRvX2JmciAqIGlwYzA4X2JmciAqIDEwMDAgLA0KICAgICAgICAgdW5pZGFkID0gImFycyIpICU+JSANCiAgc2VsZWN0KC1pcGMwOF9iZnIpICU+JSANCiAgbGVmdF9qb2luKHJldGVuY2lvbmVzX2NhbXBvZG9uaWNvKQ0KDQoNCnJlbnRlbmNpb25lc19yZWdhbGlhcyA8LSByZWdhbGlhcyAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lIA0KICBzdW1tYXJpc2UocmVnYWxpYXNfdG90YWwgPSBzdW0ocmVnYWxpYXNfdG90YWwsIG5hLnJtID0gVCkpICU+JSANCiAgbGVmdF9qb2luKHJldGVuY2lvbmVzX2NydWRvICU+JSBzZWxlY3QoLWMocmV0ZW5jaW9uZXNfY3J1ZG9fYmZyLCByZXRlbmNpb25lc19oYykpKSANCg0KDQoNCnJldGVuY2lvbmVzX2NydWRvDQoNCg0KYGBgDQoNCg0KDQoNCiQkUmltcCA9IFJFICsgUmVnJCQNCg0KRG9uZGU6DQoNCiogJFJpbXAkID0gUmVudGEgYXByb3BpYWRhIHBvciBlbCBFc3RhZG8gbWVkaWFudGUgaW1wdWVzdG9zIGVzcGVjw61maWNvcw0KKiAkUkUkID0gUmV0ZW5jaW9uZXMNCiogJFJlZyQgPSBSZWdhbGlhcw0KDQojIFJlbnRhIGFwcm9waWFkYSBwb3IgY29uc3VtaWRvcmVzIHkgcmVmaW5lcsOtYXMgeSBwcm9jZXNhZG9yYXMNCg0KIyMjIENyaXRlcmlvIGRlIGPDs21wdXRvIGRlIFJhbcOzbiAoMjAxOSkNCg0KIyMjIyBSZWZpbmVyw61hcyB5IHByb2Nlc2Fkb3Jhcw0KDQokJFJSID0gKFBJIC0gUFJNaSkgKiBDcnVkb1AkJA0KDQoNCg0KKiAkUlIkID0gUmVudGEgYXByb3BpYWRhIHBvciBsYXMgUmVmaW5hZG9yYXMgDQoqICRQSSQgPSBwcm9tZWRpbyBwb25kZXJhZG8gZGUgUHJlY2lvcyBJbnRlcm5hY2lvbmFsZXMgDQoqICRQUk1pJCA9IFByZWNpbyBwb25kZXJhZG8gYSBSZWZpbmVyw61hcyBkZWwgTWVyY2FkbyBJbnRlcm5vDQoqICRDcnVkb1AkID0gYmFycmlsZXMgZGUgQ3J1ZG8gUHJvY2VzYWRvIHBvciBsYXMgcmVmaW5hZG9yYXMNCg0KIyMjIyBDb25zdW1pZG9yZXMNCg0KJCRSQyA9IChQSSAtIFBSTWkgLSBNUikgKiBDcnVkb1AgJCQNCg0KKiAkUkMkID0gUmVudGEgYXByb3BpYWRhIHBvciBsb3MgQ29uc3VtaWRvcmVzDQoqICRNUiQgPSBNYXJnZW4gZGUgUmVmaW5lcsOtYXMNCg0KRXN0byByZXN1bHRhIGVxdWl2YWxlbnRlIGEgcGxhbnRlYXI6DQoNCiQkUkMgPSBQQ01pICogQ3J1ZG9QJCQNCg0KKiAkUENNaSQgPSBQcmVjaW8gcG9uZGVyYWRvIGEgQ29uc3VtaWRvcmVzIGRlbCBNZXJjYWRvIEludGVybm8uDQoNCg0KDQoNCiMgUmVudGEgSGlkcm9jYXJidXLDrWZlcmEgVG90YWwuIEVuIHByZWNpb3MgY29uc3RhbnRlcywgc29icmUgUGx1c3ZhbMOtYSBUb3RhbCB5IFBCSQ0KDQpFeGlzdGVuIGRvcyBjYW1pbm9zIHBhcmEgbGxlZ2FyIGFsIG1vbnRvIHRvdGFsIGRlIHJlbnRhIGRlIGxhIHRpZXJyYSBoaWRyb2NhcmJ1csOtZmVyYTogdW5vIGVzIGRlc2NvbnRhbmRvIGxhIGdhbmFuY2lhIG5vcm1hbCBkZSBsYXMgZW1wcmVzYXMgYSBsYSBwbHVzdmFsw61hIHRvdGFsIGRlbCBzZWN0b3IgeSBlbCBvdHJvIGVzIHBvciBtZWRpbyBkZSBsYSBzdW1hIGRlIG1lY2FuaXNtb3MgZGUgYXByb3BpYWNpw7NuLg0KDQokJFJlbnRhXF9oaWRyb2NhcmJ1csOtZmVyYSA9IFBWX3toaWRyb2NhcmJ1csOtZmVyYX0gLSBHY2lhXF9Ob3JtYWxfe2hpZHJvY2FyYnVyw61mZXJhfSQkDQpEb25kZToNCg0KKiAkR2NpYVxfTm9ybWFsX3toaWRyb2NhcmJ1csOtZmVyYX0kID0gR2FuYW5jaWEgTm9ybWFsIGRlbCBzZWN0b3IgaGlkcm9jYXJidXLDrWZlcm8NCiogJFBWX3toaWRyb2NhcmJ1csOtZmVyYX0kID0gUGx1c3ZhbMOtYSBkZWwgc2VjdG9yIGhpZHJvY2FyYnVyw61mZXJvICANCg0KJCRHY2lhXF9Ob3JtYWxfe2hpZHJvY2FyYnVyw61mZXJhfSA9IEtUQV97aGlkcm9jYXJidXLDrWZlcm99ICogVEdfe3JlZmVyZW5jaWF9JCQNCg0KDQpEb25kZToNCg0KKiAkS1RBX3toaWRyb2NhcmJ1cm9zfSQgPSBTdG9jayBkZSBjYXBpdGFsIGFkZWxhbnRhZG8gZGVsIHNlY3RvciBoaWRyb2NhcmJ1csOtZmVybyANCiogJFRHX3tyZWZlcmVuY2lhfSQgPSBUYXNhIGRlIGdhbmFuY2lhIG5vcm1hbCBkZSByZWZlcmVuY2lhLg0KDQpFbiBlc3RlIGNhc28sIHNlbGVjY2lvbmFtb3MgbGEgdGFzYSBkZSBnYW5hbmNpYSBkZWwgc2VjdG9yIGluZHVzdHJpYWwgY29tbyBwYXLDoW1ldHJvIHBhcmEgZGlmZXJlbmNpYXIgbGEgcmVudGEgZGUgbGEgZ2FuYW5jaWEuIEEgc3UgdmV6LCBwYXJhIGVsIGNhcGl0YWwgdG90YWwgYWRlbGFudGFkbyBkZSBsYXMgZW1wcmVzYXMgaGlkcm9jYXJidXLDrWZlcmFzLCBzZWxlY2Npb25hbW9zIHVuaWNhbWVudGUgZWwgdmFsb3IgcmVzdWx0YW50ZSBkZSBsYSBlc3RpbWFjacOzbiBkZSBsYSBQUHlFIGRlIEJvbHNhciBhIHBhcnRpciBkZWwgaW5kaWNlIGRlIGZsdWpvIGRlIHBvem9zICh2YXJpYWJsZSAicHB5ZV9ib2xzYXJfZmx1am8iKSwgcG9yIGxvIHF1ZSBsZSBmYWx0YW4gbG9zIGludmVudGFyaW9zIHkgc2FsYXJpb3MgYWRlbGFudGFkb3MuDQoNCkVsIGPDoWxjdWxvIGRlIHJlbnRhIHRvdGFsIGhpZHJvY2FyYnVyw61mZXJhIHF1ZSBzZSBvYnRpZW5lIHBvciBtZWRpbyBkZSBkZXNjb250YXIgbGEgZ2FuYW5jaWEgbm9ybWFsIGEgbGEgcGx1c3ZhbMOtYSB0b3RhbCBkZWwgc2VjdG9yLCBkZWJlIHNlciBpZ3VhbCBhIGxhIHJlbnRhIG9idGVuaWRhIHBvciBtZWRpbyBkZSBsYSBhZ3JlZ2FjacOzbiBkZSBsb3MgZGlzdGludG9zIG1lY2FuaXNtb3MgZGUgYXByb3BpYWNpw7NuLiBFcyBkZWNpcjoNCg0KJCRSZW50YVxfaGlkcm9jYXJidXLDrWZlcmEgPSBSZW50YVxfZGlmZXJlbmNpYWxcX3ByZWNpb3MgKyBSZW50YVxfc29icmV2YWx1YWNpw7NuICsgUmVudGFcX2VtcHJlc2FzICsgSW1wdWVzdG9zXF9uZXRvc1xfZXNwZWPDrWZpY29zICQkDQokJEltcHVlc3Rvc1xfbmV0b3NcX2VzcGVjw61maWNvcyA9IFJldGVuY2lvbmVzICsgUmVnYWzDrWFzIC0gU3Vic2lkaW9zJCQNCg0KIyMgTcOpdG9kbyBkaXJlY3RvIChhIHBhcnRpciBkZSBkZXNjdWVudG9zIHNvYnJlIGVsIFZCUCkNCg0KYGBge3IgZWNobz1GQUxTRX0NCiMga25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG89IFRSVUUsZmlnLndpZHRoID0gMTIwLGZpZy5oZWlnaHQgPSA0MDApDQpyZW50YV9kaXJlY3RvIDwtIHJlbnRhX3RnICU+JSANCiAgc2VsZWN0KGFuaW8sIHBweWUgLCAjZXMgc3RvY2sgZGUgYm9sc2FyDQogICAgICAgICB0Z19oaWRyb2NhcmJ1cm9zLCB0Z19ub3JtYWwgPSB1bmlvbl90ZykgJT4lIA0KICBsZWZ0X2pvaW4oY3JpdGVyaW9fcHJvcGlvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICBwdikgKSU+JSANCiAgbGVmdF9qb2luKHN1YnNpZGlvc19oaWRyb2NhcmJ1cm9zICU+JSANCiAgICAgICAgICAgICAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCksIGJ5ID0iYW5pbyIpICU+JQ0KICAgICAgICAgICAgICBtdXRhdGUoc3Vic2lkaW9zID0gKHN1YnNpZGlvc19lamVzLzEwXjYpL2lwY18xOCwgDQogICAgICAgICAgICAgICAgICAgICBzdWJzaWRpb3MgPXJlcGxhY2VfbmEoc3Vic2lkaW9zLCAwKSApICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHN1YnNpZGlvcykpICU+JSANCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCksIGJ5ID0iYW5pbyIpICU+JSANCiAgbXV0YXRlKHJlbnRhX2Nvbl90Z19ub3JtYWwgPSBwcHllKiAodGdfaGlkcm9jYXJidXJvcyAtIHRnX25vcm1hbCksDQogICAgICAgICBnY2lhX25vcm1hbF9oaWRyb2NhcmJ1cm9zID0gcHB5ZSAqIHRnX25vcm1hbCwNCiAgICAgICAgIHJlbnRhX3RvdGFsID0gKHB2L2lwY18xOCkgLSBnY2lhX25vcm1hbF9oaWRyb2NhcmJ1cm9zIC1zdWJzaWRpb3MsDQogICAgICAgICAjIHByb3BvcmNpb25fc3Vic2lkaW9zID0gc3Vic2lkaW9zLw0KICAgICAgICAgIyAgIChwdiAtIGdjaWFfbm9ybWFsX2hpZHJvY2FyYnVyb3MpLA0KICAgICAgICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiKSAlPiUgDQogIHNlbGVjdChhbmlvICwgaXBjXzE4LCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLiksIC1yZW50YV9jb25fdGdfbm9ybWFsKSAlPiUgI3NhY28gcmVudGFfY29uX3RnX25vcm1hbCBwb3Igbm8gdXNvDQogIGZpbHRlcihhbmlvID4xOTk3KQ0KcmVudGFfZGlyZWN0bw0KDQpyZW50YV9kaXJlY3RvICU+JQ0KICBmaWx0ZXIoYW5pbyA+MTk2MCkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHJlbnRhX3RvdGFsKSkrIA0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSB0b3RhbCBhIHBhcnRpciBkZSBlc3RpbWFjacOzbiBwcm9waWEgZGVsIFZCUCIsDQogICAgICAgeSA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQ0KDQoNCg0KcmVudGFfZGlyZWN0b19wYmkgPC0gcmVudGFfZGlyZWN0byAlPiUgDQogIGxlZnRfam9pbihnYW5hbmNpYV95X3BiaSAlPiUgcmVuYW1lKHVuaWRhZF9wYmlfZ2NpYSA9IHVuaWRhZCksICBieSA9ICJhbmlvIikgJT4lIA0KICAjIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpLCAgYnkgPSAiYW5pbyIpICU+JSANCiAgbXV0YXRlKHJlbnRhX3B2ID0ocmVudGFfdG90YWwqaXBjXzE4ICkvZ2FuYW5jaWEsIA0KICAgICAgICAgcmVudGFfcGJpID0ocmVudGFfdG90YWwqaXBjXzE4ICkvcGJpICkNCg0KDQpncmFmX3JlbnRhX2RpcmVjdG9fcGJpIDwtIHJlbnRhX2RpcmVjdG9fcGJpICU+JSANCiAgc2VsZWN0KGFuaW8sIHJlbnRhX3B2LHJlbnRhX3BiaSApICU+JQ0KICAjIGZpbHRlcihhbmlvID49IDE5NjIsIGZ1ZW50ZV9nY2lhID09ICJQcm9waWEiKSAlPiUNCiAgZmlsdGVyKGFuaW8gPj0gMTk2MikgJT4lDQogIGdhdGhlcihrZXkgPSB0aXBvX3JlbnRhLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDI6MykgJT4lDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IpKSsNCiAgIyBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICBnZW9tX2xpbmUoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQogIGxhYnModGl0bGUgPSAiUmVudGEgaGlkcm9jYXJidXLDrWZlcmEgdG90YWwgc29icmUgUEJJIHkgR2FuYW5jaWFzIFRvdGFsZXMiLA0KICAgICAgIHN1YnRpdGxlID0gIkEgcGFydGlyIGRlIGVzdGltYWNpw7NuIHByb3BpYSBkZWwgVkJQIiwNCiAgICAgICB5ID0gIiUiKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMikpKw0KICBmYWNldF9ncmlkKH50aXBvX3JlbnRhICkNCg0KIyBncmFmX3JlbnRhX2RpcmVjdG9fcGJpDQpnZ3Bsb3RseShncmFmX3JlbnRhX2RpcmVjdG9fcGJpLCBoZWlnaHQgPSA0MDAsIHdpZHRoID0gNjAwKQ0KDQpgYGANCg0KDQojIyBNw6l0b2RvIGluZGlyZWN0byAoc3VtYSBkZSBtZWNhbmlzbW9zKQ0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KcmVudGFfaW5kaXJlY3RvIDwtIHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvICU+JSANCiAgIyBzZWxlY3QoYW5pbyxyZW50YV9kaWZfcHJlY2lvc19jcnVkbywgcmVudGFfZGlmX3ByZWNpb3NfYnJlbnQgKSAlPiUNCiAgc2VsZWN0KGFuaW8scmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gKSAlPiUNCiAgbGVmdF9qb2luKHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzICU+JSBzZWxlY3QoYW5pbywgcmVudGFfZGlmX3ByZWNpb3NfZ2FzKSApICU+JSANCiAgbGVmdF9qb2luKHJlbnRlbmNpb25lc19yZWdhbGlhcyAlPiUgc2VsZWN0KC11bmlkYWQpICU+JSANCiAgICAgICAgICAgICAgcmVuYW1lKHJldGVuY2lvbmVzID0gcmV0ZW5jaW9uZXNfY3J1ZG9famspKSAlPiUgDQogIGxlZnRfam9pbihyZW50YV90Y3BfY3J1ZG8gJT4lIHNlbGVjdChhbmlvLCByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkbykpICU+JSANCiAgbGVmdF9qb2luKHJlbnRhX3RjcF9nYXMgJT4lIHNlbGVjdChhbmlvLCByZW50YV9zb2JyZXZhbHVhY2lvbl9nYXMpKSAlPiUgDQogICBsZWZ0X2pvaW4oc3Vic2lkaW9zX2hpZHJvY2FyYnVyb3MgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgc3Vic2lkaW9zID0gc3Vic2lkaW9zX2VqZXMpLCBieSA9ImFuaW8iKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8gKSAlPiUgDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkge3ggLyAxMF42fSkgJT4lICNsYXMgdmJsZXMgY2FyZ2FkYXMgYW50ZXJpb3JtZW50ZSBzZSBwYXNhbiBhIE1NDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkgcmVwbGFjZV9uYSh4LCAwKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBsZWZ0X2pvaW4ocmVudGFfcHJvZHVjY2lvbl9iYWxhbmNlcyAlPiUgc2VsZWN0KGFuaW8sIHJlbnRhX2VtcHJlc2FzX2Rlc3BfaW1wdWVzdG9zKSkgJT4lDQogICMgbGVmdF9qb2luKHJlbnRhX2RpcmVjdG8gJT4lDQogICMgICAgICAgICAgICAgZmlsdGVyKHN0b2NrX3NlbGVjY2lvbmFkbyA9PSAicHB5ZV9ib2xzYXIiKSAlPiUNCiAgIyAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcmVudGFfZW1wcmVzYXMgPSByZW50YV9jb25fdGdfbm9ybWFsKSAlPiUgDQogICMgICAgICAgICAgICAgbXV0YXRlKHJlbnRhX2VtcHJlc2FzID0gMCkpICU+JQ0KICBsZWZ0X2pvaW4odGNwX2FudWFsX2IpICU+JSANCiAgbGVmdF9qb2luKGdhbmFuY2lhX3lfcGJpICU+JSByZW5hbWUodW5pZGFkX3BiaV9nY2lhID0gdW5pZGFkKSkgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lIA0KICBtdXRhdGUoDQogICAgcmVudGFfZGlmX3ByZWNpb3NfZ2FzID0gcmVudGFfZGlmX3ByZWNpb3NfZ2FzIC9pcGNfMTgsDQogICAgICAgICByZW50YV9kaWZfcHJlY2lvc19jcnVkbyA9IHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvIC8gaXBjXzE4LA0KICAgICAgICAgIyByZW50YV9kaWZfcHJlY2lvc19icmVudCA9IHJlbnRhX2RpZl9wcmVjaW9zX2JyZW50IC9pcGNfMTgsDQogICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkbyA9IHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvL2lwY18xOCwNCiAgICAgICAgIHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcyA9IHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcy9pcGNfMTgsDQogICAgICAgICByZWdhbGlhc190b3RhbCA9IHJlZ2FsaWFzX3RvdGFsIC8gaXBjXzE4LA0KICAgICAgICAgcmV0ZW5jaW9uZXMgPSByZXRlbmNpb25lcyAvIGlwY18xOCwgDQogICAgICAgICBzdWJzaWRpb3MgPSBzdWJzaWRpb3MvaXBjXzE4LA0KICAgIHJlbnRhX2VtcHJlc2FzX2Rlc3BfaW1wdWVzdG9zID1yZXBsYWNlX25hKHJlbnRhX2VtcHJlc2FzX2Rlc3BfaW1wdWVzdG9zLCAgMCksDQogICAgICAgICByZW50YV9lbXByZXNhc19kZXNwX2ltcHVlc3RvcyA9IHJlbnRhX2VtcHJlc2FzX2Rlc3BfaW1wdWVzdG9zL2lwY18xOCwNCiAgICAgICAgIHJlbnRhX3RvdGFsID0gcmVudGFfZGlmX3ByZWNpb3NfZ2FzKyByZW50YV9kaWZfcHJlY2lvc19jcnVkbyArDQogICAgICAgICAgIHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvICsgcmVudGFfc29icmV2YWx1YWNpb25fZ2FzICsNCiAgICAgICAgICAgcmVudGFfZW1wcmVzYXNfZGVzcF9pbXB1ZXN0b3MrDQogICAgICAgICAgIHJlZ2FsaWFzX3RvdGFsICsgIHJldGVuY2lvbmVzIC0gc3Vic2lkaW9zLA0KICAgICAgICAgcHJvcG9yY2lvbl9zdWJzaWRpb3MgPSBzdWJzaWRpb3MvKHJlbnRhX2RpZl9wcmVjaW9zX2dhcysgcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gKw0KICAgICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkbyArIHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcyArDQogICAgICAgICAgIHJlZ2FsaWFzX3RvdGFsICsgIHJldGVuY2lvbmVzKSAgLA0KICAgICAgICAgcmVudGFfcHYgPSAocmVudGFfdG90YWwqaXBjXzE4KS9nYW5hbmNpYSwNCiAgICAgICAgIHJlbnRhX3BiaSA9IChyZW50YV90b3RhbCppcGNfMTgpL3BiaSwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyAyMDE4IiwNCiAgICAgICAgIHJlbnRhX3VzZF90Y2MgPSAocmVudGFfdG90YWwqaXBjXzE4KSAvIHRjYywgDQogICAgICAgICByZW50YV91c2RfdGNwID0gKHJlbnRhX3RvdGFsKmlwY18xOCkgLyB0Y3AsKSAgJT4lIA0KICByZW5hbWUocmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMgPSByZW50YV9kaWZfcHJlY2lvc19nYXMsDQogICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2NydWRvID0gcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8sDQogICAgICAgICAjIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfYnJlbnQgPSByZW50YV9kaWZfcHJlY2lvc19icmVudCwNCiAgICAgICAgIHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2NydWRvID0gcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8gLA0KICAgICAgICAgcmVudGFfZXhwb19zb2JyZXZhbHVhZGFfZ2FzID0gcmVudGFfc29icmV2YWx1YWNpb25fZ2FzLCkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBpcGNfMTgsdGNjLHRjcCwgZXZlcnl0aGluZyguKSAsIC1zb2JyZXZhbHVhY2lvbikgJT4lIA0KICAjIHNlbGVjdCgtcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8pDQogICMgc2VsZWN0KC1yZW50YV9kaWZfcHJlY2lvc19icmVudCkgJT4lIA0KICBkaXN0aW5jdCgpDQoNCg0KI1JlbnRhIHRvdGFsDQpncmFmX3JlbnRhX3RvdGFsIDwtIHJlbnRhX2luZGlyZWN0byAlPiUNCiAgZmlsdGVyKGFuaW8gPjE5NjApICU+JSANCiAgc2VsZWN0KC1jKHVuaWRhZCwgaXBjXzE4LCByZW50YV90b3RhbCwgdGNjLCB0Y3AsDQogICAgICAgICAgICBzdWJzaWRpb3MsIHByb3BvcmNpb25fc3Vic2lkaW9zKSkgJT4lIA0KICBnYXRoZXIoa2V5ID0gdGlwb19yZW50YSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAyOjgpICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSB0aXBvX3JlbnRhLCBmaWxsID0gdGlwb19yZW50YSkpKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJzdGFjayIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiUmVudGEgaGlkcm9jYXJidXLDrWZlcmEgdG90YWwgKHBldHLDs2xlbyB5IGdhcykiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJDdXJzb3MgZGUgYXByb3BpYWNpw7NuLiBNaWxsb25lcyBwZXNvcyBkZSAyMDE4IiwgDQogICAgICAgeSA9ICJNaWxsb25lcyBkZSBwZXNvcyAyMDE4IikrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9ZnVuY3Rpb24oeCkgZm9ybWF0KHgsIGJpZy5tYXJrID0gIi4iLCBzY2llbnRpZmljID0gRkFMU0UpKSsNCiAgdGhlbWVfY2xhc3NpYygpDQoNCmdncGxvdGx5KGdyYWZfcmVudGFfdG90YWwsIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQoNCiMgcHJvcG9yY2lvbiBzdWJzaWRpb3MNCiMgcmVudGFfaW5kaXJlY3RvWyxjKCJhbmlvIiwicHJvcG9yY2lvbl9zdWJzaWRpb3MiKV0gJT4lIGFycmFuZ2UoLWFuaW8pDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KI1JlbnRhIHRjcCB5IHRjYw0KZ3JhZl9yZW50YV90b3RhbF91c2QgPC0gcmVudGFfaW5kaXJlY3RvICU+JSANCiAgc2VsZWN0KGMoYW5pbywgcmVudGFfdXNkX3RjYywgcmVudGFfdXNkX3RjcCkpICU+JQ0KICBmaWx0ZXIoYW5pbyA+IDE5NjIpICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fcmVudGEsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMjozKSAlPiUNCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSB0aXBvX3JlbnRhKSApKw0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiUmVudGEgaGlkcm9jYXJidXLDrWZlcmEgdG90YWwgKHBldHLDs2xlbyB5IGdhcykiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJNaWxsb25lcyBkZSBVU0QiLCANCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIFVTRCIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9ZnVuY3Rpb24oeCkgZm9ybWF0KHgsIGJpZy5tYXJrID0gIi4iLCBzY2llbnRpZmljID0gRkFMU0UpKQ0KZ2dwbG90bHkoZ3JhZl9yZW50YV90b3RhbF91c2QsIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQoNCg0KDQoNCiNjb21wYXJhY2lvbiBjb24gRlINCmdyYWZfY29tcGFyYWNpb25fcmVudGFzIDwtIHJlbnRhX2luZGlyZWN0byAlPiUgDQogIG11dGF0ZShmdWVudGUgPSAiUHJvcGlhIHZpYSBzdW1hIGRlIG1lY2FuaXNtb3MiKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsZnVlbnRlLCAgcmVudGFfdG90YWwgKSAlPiUgDQogIGJpbmRfcm93cyhyZW50YV9kaXJlY3RvX3BiaSAlPiUgDQogICAgICAgICAgICAgICAgbXV0YXRlKGZ1ZW50ZSA9ICJQcm9waWEgdmlhIGRlc2N1ZW50b3Mgc29icmUgVkJQIikgJT4lIA0KICAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sZnVlbnRlLCAgcmVudGFfdG90YWwgKSApICU+JSANCiAgYmluZF9yb3dzKHJlbnRhX2hpZHJvY2FyYnVyb3NfZnIgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUoZnVlbnRlID0gIkbDoXJmYXJvIFJ1aXogeSBCaWxsIikgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIGZ1ZW50ZSwgIHJlbnRhX3RvdGFsKSkgJT4lIA0KICBmaWx0ZXIoYW5pbyA+PSAxOTYyKSAlPiUNCiAgZ2dwbG90KGFlcyhhbmlvLCByZW50YV90b3RhbCwgY29sb3IgPSBmdWVudGUpKSsNCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjM1KSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIHRvdGFsIChwZXRyw7NsZW8geSBnYXMpIiwgDQogICAgICAgc3VidGl0bGUgPSAiQ29tcGFyYWNpw7NuIGRlIGVzdGltYWNpb25lcy4gTWlsbG9uZXMgcGVzb3MgZGUgMjAxOCIsIA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIpKw0KICB0aGVtZV9jbGFzc2ljKCkNCmdyYWZfY29tcGFyYWNpb25fcmVudGFzDQoNCg0KI3NvYnJlIHBiaSB5IHB2DQpncmFmX3JlbnRhX3RvdGFsX3B2IDwtIHJlbnRhX2luZGlyZWN0byAlPiUgDQogIHNlbGVjdChhbmlvLCByZW50YV9wdixyZW50YV9wYmkgKSAlPiUNCiAgZmlsdGVyKGFuaW8gPj0gMTk2MikgJT4lDQogIGdhdGhlcihrZXkgPSB0aXBvX3JlbnRhLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDI6MykgJT4lDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gdGlwb19yZW50YSwgZmlsbCA9IHRpcG9fcmVudGEpKSsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIHRvdGFsIHNvYnJlIFBCSSB5IEdhbmFuY2lhcyBUb3RhbGVzIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJTdW1hIGRlIG1lY2FuaXNtb3MiLA0KICAgICAgIHkgPSAiJSIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPXNjYWxlczo6cGVyY2VudCkNCg0KDQpnZ3Bsb3RseShncmFmX3JlbnRhX3RvdGFsX3B2LCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQoNCg0KI3NvbG8gcmVudGEgZW1wcmVzYXMNCiMgcmVudGFfaW5kaXJlY3RvICU+JQ0KIyAgIGZpbHRlcihhbmlvID4gMTk2MCkgJT4lIA0KIyAgIG11dGF0ZShyZW50YV9lbXByZXNhc19wdiA9IHJlbnRhX2VtcHJlc2FzKmlwY18xOC9nYW5hbmNpYSwNCiMgICAgICAgICAgcmVudGFfZW1wcmVzYXNfcGJpID0gcmVudGFfZW1wcmVzYXMqaXBjXzE4L3BiaSkgJT4lIA0KIyAgIHNlbGVjdChhbmlvLCByZW50YV9lbXByZXNhc19wdiwgcmVudGFfZW1wcmVzYXNfcGJpKSAlPiUgDQojICAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLCB2YWx1ZSA9IHZhbG9yLCAyOjMgKSAlPiUgDQojICAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgZmlsbCA9IHZhcmlhYmxlKSkrDQojICAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiMgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQojICAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSBhcHJvcGlhZGEgcG9yIGVtcHJlc2FzIHNvYnJlIFBCSSB5IEdhbmFuY2lhcyBUb3RhbGVzIiwNCiMgICAgICAgIHkgPSAiJSIpKw0KIyAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9c2NhbGVzOjpwZXJjZW50KQ0KDQogIA0KYGBgDQoNCg0KYGBge3J9DQojIyMjIyMjIyMjIyMjIyMjIyMjIyBzb2xvIGdhcw0KIyBHYXMNCiMgcmVudGFfZ2FzX3BiaV9wdiA8LSByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcyAlPiUgDQojICAgc2VsZWN0KGFuaW8scmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMsIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fZ2FzICkgJT4lIA0KIyAgIGdyb3VwX2J5KGFuaW8gKSAlPiUgDQojICAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSB7eCAvIDEwXjZ9KSAlPiUgDQojICAgbGVmdF9qb2luKGdhbmFuY2lhX3lfcGJpKSAlPiUgDQojICAgbXV0YXRlKHJlbnRhX2RpZl9wcmVjaW9zX2dhc19wdiA9IHJlbnRhX2RpZl9wcmVjaW9zX2dhcy9nYW5hbmNpYSwNCiMgICAgICAgICAgcmVudGFfZGlmX3ByZWNpb3NfZ2FzX3BiaSA9IHJlbnRhX2RpZl9wcmVjaW9zX2dhcy9wYmksDQojICAgICAgICAgIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fZ2FzX3B2ID0gcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbl9nYXMvZ2FuYW5jaWEsDQojICAgICAgICAgIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fZ2FzX3BiaSA9IHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fZ2FzL3BiaSwNCiMgICAgICAgICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIFBlc29zIGNvcnJpZW50ZXMiKQ0KIyANCiMgZ3JhZl9yZW50YV9nYXNfcHYgPC0gcmVudGFfZ2FzX3BiaV9wdiAlPiUgDQojICAgc2VsZWN0KGFuaW8sIDc6bmNvbCguKSApICU+JSANCiMgICBnYXRoZXIoa2V5ID0gdGlwb19yZW50YSwNCiMgICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiMgICAgICAgICAgMjpuY29sKC4pKSAlPiUgDQojICAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSB0aXBvX3JlbnRhLCBmaWxsID0gdGlwb19yZW50YSkpKw0KIyAgIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikrDQojICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KIyAgIGxhYnModGl0bGUgPSAiUmVudGEgcGV0cm9sZXJhIHBvciBkaWZlcmVuY2lhbCBkZSBwcmVjaW9zIGludGVybm8geSBleHRlcm5vIHNvYnJlIFBCSSB5IEdhbmFuY2lhcyBUb3RhbGVzIiwNCiMgICAgICAgIHkgPSAiJSIpDQojIHBsb3RseTo6Z2dwbG90bHkoZ3JhZl9yZW50YV9nYXNfcHYpDQpgYGANCg0KIyMgQ29zdG9zDQoNCiQkUVxfdG90YWwgPSBRX3twZXRyw7NsZW99ICsgUV97Z2FzfSAkJA0KRG9uZGU6DQogIA0KICAqICRRXF90b3RhbCQgPSBDYW50aWRhZGVzIHByb2R1Y2lkYXMgZGUgcGV0csOzbGVvIHkgZ2FzIGVuIEJhcnJpbGVzIEVxdWl2YWxlbnRlcyBkZSBQZXRyw7NsZW8NCiAgKiAkUV97cGV0csOzbGVvfSQgPSBDYW50aWRhZGVzIHByb2R1Y2lkYXMgZGUgcGV0csOzbGVvIGNydWRvIGVuIGJhcnJpbGVzIGVxdWl2YWxlbnRlcyBkZSBwZXRyw7NsZW8gKEJPRSkNCiAgKiAkUV97Z2FzfSQgPSBDYW50aWRhZGVzIHByb2R1Y2lkYXMgZGUgZ2FzIG5hdHVyYWwgZW4gYmFycmlsZXMgZXF1aXZhbGVudGVzIGRlIHBldHLDs2xlbyAoQk9FKQ0KICANCg0KJCQgQ29zdG9zXF90b3RhbGVzID0gIENJICsgTVMgKyBDb25LZmlqbyQkDQoNCkRvbmRlOg0KDQoqICRDb3N0b3NcX3RvdGFsZXMkID0gQ29zdG9zIHRvdGFsZXMgaGlkcm9jYXJidXLDrWZlcm9zDQoqICRDSSQgPSBDb25zdW1vIEludGVybWVkaW8sIGRpc3RpbnRhcyBlc3RpbWFjaW9uZXMNCiogJE1TJCA9IE1hc2EgU2FsYXJpYWwsIGRpc3RpbnRhcyBlc3RpbWFjaW9uZXMNCiogJENvbktmaWpvJCA9IENvbnN1bW8gZGUgQ2FwaXRhbCBGaWpvDQoNCg0KJCRDb3N0b3NcX3RvdGFsZXNcX2NvblxfR2NpYSA9IENvc3Rvc1xfdG90YWxlcyArIEdjaWFcX05vcm1hbF97aGlkcm9jYXJidXLDrWZlcmF9ICQkDQpEb25kZToNCg0KKiAkQ29zdG9zXF90b3RhbGVzXF9jb25cX0djaWEkID0gQ29zdG9zIHRvdGFsZXMgaGlkcm9jYXJidXLDrWZlcm9zIGNvbiBnYW5hbmNpYSBub3JtYWwgDQoqICRHY2lhXF9Ob3JtYWxfe2hpZHJvY2FyYnVyw61mZXJhfSQgPSBHYW5hbmNpYSBub3JtYWwgZGVsIHNlY3RvciBoaWRyb2NhcmJ1csOtZmVybw0KDQokJCBQcmVjaW9cX2Nvc3RvID0gXGZyYWN7Q29zdG9zXF90b3RhbGVzfXtRXF90b3RhbH0gICAkJA0KRG9uZGU6DQoqICRQcmVjaW9cX2Nvc3RvJCA9IFByZWNpbyBkZSBjb3N0byBlbiBCT0UNCg0KQSBwYXJ0aXIgZGUgZXN0byBzZSBwdWVkZSBjYWxjdWxhciB1biBjb3N0byByZWN1cGVyYWJsZSBkZWwgcGV0csOzbGVvIHkgZGVsIGdhcw0KDQokJENvc3RvXF9jcnVkbyA9IFFfe3BldHLDs2xlb30gKiBQcmVjaW9cX2Nvc3RvJCQNCiQkQ29zdG9cX2dhcyA9IFFfe2dhc30gKiBQcmVjaW9cX2Nvc3RvJCQNCg0KDQokJFByZWNpb1xfcHJvZHVjY2lvbiA9IFxmcmFje0Nvc3Rvc1xfdG90YWxlc1xfY29uXF9HY2lhfXtRXF90b3RhbH0kJA0KDQokJFByZWNpb1xfdnRhXF9wb3RlbmNpYWwgPSAgXGZyYWN7UVxfdG90YWwqUGV4dF97cGV0csOzbGVvfSAtIENvc3Rvc1xfdG90YWxlc317UVxfdG90YWx9ICQkDQoNCg0KRG9uZGU6DQoqICRQcmVjaW9cX3Byb2R1Y2Npb24kPSBQcmVjaW8gZGUgcHJvZHVjY2lvbg0KKiAkUHJlY2lvX3Z0YV9wb3RlbmNpYWwkID0gUHJlY2lvIGRlIHZlbnRhIHBvdGVuY2lhbA0KKiAkUGV4dF97cGV0csOzbGVvfSQgPSBQcmVjaW8gZGUgZXhwb3J0YWNpw7NuL3JlZmVyZW5jaWEgaW50ZXJuYWNpb25hbCBkZWwgcGV0csOzbGVvIGNydWRvDQoNCmBgYHtyfQ0KI2VzdGltYWNpb24gY29zdG9zIHByb3BpYQ0KY29zdG9zIDwtIHByb2R1Y2Npb25fdG90YWwgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkX3Byb2R1Y2Npb249dW5pZGFkLA0KICAgICAgICAgcHJvZHVjY2lvbl9jcnVkbyA9cHJvZF9jcnVkbywgcHJvZHVjY2lvbl9nYXM9cHJvZF9nYXMsDQogICAgICAgICBwcm9kdWNjaW9uX3RvdGFsPXByb2R1Y2Npb25fdG90YWxfYmVwKSAlPiUgDQogbGVmdF9qb2luKHN0b2NrX2VzdGltYWRvICU+JQ0KICAgICAgICAgICAgICAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JQ0KICAgICAgICAgICAgICAjIGZpbHRlcih2YXJpYWJsZSA9PSAicHB5ZV9lc3RpbWFkb19ib2xzYXIiKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShjb25zdW1vX2tfZmlqbyA9IHZhbG9yICogaXBjXzE4ICogY29uc3Vtb19rX2Zpam9feXBmKSAlPiUgDQogICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgY29uc3Vtb19rX2Zpam8pKSAlPiUNCiAgbGVmdF9qb2luKHZhbG9yX3RvdGFsX3Byb2R1Y2Npb24gJT4lIA0KICAgICAgICAgICAgICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lIA0KICAgICAgICAgICAgICBsZWZ0X2pvaW4odGNwX2FudWFsX2IgJT4lIHNlbGVjdCgtc29icmV2YWx1YWNpb24pKSAlPiUNCiAgICAgICAgICAgICAgZmlsdGVyKHZhcmlhYmxlICVpbiUgYygiY2lfZXh0ciIsICJtc19leHRyIiksDQogICAgICAgICAgICAgICAgICAgICBmdWVudGUlaW4lIGMoIkNyaXRlcmlvIENDTk4iLCAiQ0NOTiBvZmljaWFsIiwgIkVtcGFsbWUgQ0NOTiIpKSAlPiUNCiAgICAgICAgICAgICAgbXV0YXRlKHZhbG9yID0gKHZhbG9yKjEwXjYpKmlwY18xOC90Y2MsDQogICAgICAgICAgICAgICAgICAgICB1bmlkYWQgPSJVU0QgdGNjIikgJT4lIA0KICAgICAgICAgICAgICBzcHJlYWQoa2V5PXZhcmlhYmxlLCB2YWx1ZT12YWxvcikpICU+JSANCiAgbGVmdF9qb2luKHJlbnRhX2RpcmVjdG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgI3N0b2NrX3NlbGVjY2lvbmFkbywNCiAgICAgICAgICAgICAgICAgICAgIHBweWUsIHRnX25vcm1hbCwgcmVudGFfdG90YWwpICkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19yZWZlcmVuY2lhX2V4dGVybm8gPSBwcmVjaW9fbWVfY3J1ZG8pKSAlPiUgDQogIG11dGF0ZShwcHllID0gKHBweWUqMTBeNikqaXBjXzE4L3RjYywNCiAgICAgICAgIHJlbnRhX3RvdGFsID0gKHJlbnRhX3RvdGFsKjEwXjYpKmlwY18xOC90Y2MsDQogICAgICAgICB1bmlkYWRfY29zdG9zPSAiVVNEL2JvZSIsDQogICAgICAgICBjb3N0b3NfdG90YWxlcyA9IChjaV9leHRyICttc19leHRyICsgY29uc3Vtb19rX2Zpam8pLA0KICAgICAgICAgY29zdG9zX3RvdGFsZXNfc3VtX2djaWFfbm9ybWFsID0gY29zdG9zX3RvdGFsZXMgKyAocHB5ZSAgKiB0Z19ub3JtYWwpLA0KICAgICAgICAgcHJlY2lvX2Nvc3RvID0gY29zdG9zX3RvdGFsZXMvcHJvZHVjY2lvbl90b3RhbCwNCiAgICAgICAgIHByZWNpb19jb3N0b19tbWJ0dSA9IGNvbnZlcnNvcl9iZXBNTUJUVV9wKHByZWNpb19jb3N0byksDQogICAgICAgICBwcmVjaW9fcHJvZHVjY2lvbiA9Y29zdG9zX3RvdGFsZXNfc3VtX2djaWFfbm9ybWFsL3Byb2R1Y2Npb25fdG90YWwsDQogICAgICAgICBwcmVjaW9fdmVudGFfcG90ZW5jaWFsID0gKHByb2R1Y2Npb25fdG90YWwgKnByZWNpb19yZWZlcmVuY2lhX2V4dGVybm8gLQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3Rvc190b3RhbGVzKS9wcm9kdWNjaW9uX3RvdGFsICkNCiAgICAgICAgICMgcHJlY2lvX3ZlbnRhX3BvdGVuY2lhbCA9ICgocHB5ZSAqIHRnX25vcm1hbCkrcmVudGFfdG90YWwpL3Byb2R1Y2Npb25fdG90YWwpDQojIChwcm9kdWNjaW9uIHggcHJlY2lvIGludGVybmFjaW9uYWwgLSBjb3N0b3NfdG90YWxlcykgLyBiYXJyaWxlcyBCT0UgPSBnY2lhICsgcmVudGEgcG9yIGJhcnJpbCANCiNleHByZXNhciBlbiB1c2QgdGNjIHkgdGNwDQpjb3N0b3MNCg0KYGBgDQoNCmBgYHtyfQ0KY29zdG9zICU+JSANCiAgICAgICAgICAgZmlsdGVyKGFuaW8gPiAxOTk3KSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgcHJlY2lvX2Nvc3RvLCBjb2xvciA9IGZ1ZW50ZSkpKyANCiAgZ2VvbV9saW5lKGFscGhhID0gMC41LCBzaXplID0gMS40KSsNCiAgICBsYWJzKHRpdGxlID0gIlByZWNpbyBkZSBjb3N0byIsDQogICAgICAgICBzdWJ0aXRsZT0gIkVzdGltYWNpb24gcHJvcGlhIGEgcGFydGlyIGRlIENDTk4geSByZWVzdGltYWNpb24gZGUgVkJQIGNvbiBjcml0ZXJpbyBDQ05OIiwgDQogICAgICAgICB5ID0gIlVTRC9CT0UiLCB4ID0gIkHDsW8iKQ0KDQoNCmBgYA0KDQojIENvbXBhcmFjacOzbiBjb24gZXN0aW1hY2nDs24gZGUgb3Ryb3MgYXV0b3Jlcw0KDQpgYGB7cn0NCg0KI3JlbnRhIHVzZCB2cyBhdXRvcmVzDQojZmFsdGEgYWdyZWdhciByZW50YV9oaWRyb2NhcmJ1cm9zX2prDQpyZW50YV9hdXRvcmVzIDwtIHJlbnRhX2luZGlyZWN0byAlPiUgDQogIHNlbGVjdChhbmlvLHRjYywgdGNwLCBpcGNfMTgsIHJldGVuY2lvbmVzLCByZWdhbGlhc190b3RhbCwgY29udGFpbnMoInJlbnRhIikpICU+JSANCiAgc2VsZWN0KCAtKDEzOm5jb2woLikpKSAlPiUgDQogIGZpbHRlcihhbmlvID4gMTk2MikgJT4lDQogIG11dGF0ZSggcmV0ZW5jaW9uZXM9IHJldGVuY2lvbmVzKmlwY18xOC90Y2MsICAgICAgIA0KICAgICAgICAgIHJlZ2FsaWFzX3RvdGFsID0gcmVnYWxpYXNfdG90YWwqaXBjXzE4L3RjYywgDQogICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19jcnVkbyA9IHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfY3J1ZG8qaXBjXzE4L3RjcCwNCiAgICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcyA9IHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzKmlwY18xOC90Y3AsDQogICAgICAgICAgcmVudGFfZXhwb19zb2JyZXZhbHVhZGFfY3J1ZG8gPSByZW50YV9leHBvX3NvYnJldmFsdWFkYV9jcnVkbyppcGNfMTgvdGNwLCAgDQogICAgICAgICAgcmVudGFfZXhwb19zb2JyZXZhbHVhZGFfZ2FzID0gcmVudGFfZXhwb19zb2JyZXZhbHVhZGFfZ2FzKmlwY18xOC90Y3AgICwNCiAgICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbiA9IHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2NydWRvKyByZW50YV9leHBvX3NvYnJldmFsdWFkYV9nYXMsDQogICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvcyA9IA0KICAgICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMrIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfY3J1ZG8sDQogICAgICAgICAgIyByZW50YV9lbXByZXNhcyA9IHJlbnRhX2VtcHJlc2FzKmlwY18xOC90Y2MsDQogICAgICAgICAgIyByZW50YV9lbXByZXNhc19kZXNwX2ltcHVlc3RvcyA9IHJlbnRhX2VtcHJlc2FzX2Rlc3BfaW1wdWVzdG9zKmlwY18xOC90Y2MsDQogICAgICAgICAgcmVudGFfdG90YWwgPSAocmVudGFfdG90YWwqaXBjXzE4KSAvIHRjcCwNCiAgICAgICAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgVVNEIiwNCiAgICAgICAgIGF1dG9yID0gIlByb3BpYSIpICU+JSANCiAgcmVuYW1lKHJldGVuY2lvbmVzID0gcmV0ZW5jaW9uZXMsDQogICAgICAgICByZWdhbGlhcyA9IHJlZ2FsaWFzX3RvdGFsDQogICAgICAgICAgIyByZW50YV9lbXByZXNhcyA9IHJlbnRhX2VtcHJlc2FzX2Rlc3BfaW1wdWVzdG9zLA0KICAgICAgICAgIyByZW50YV90b3RhbF9nYXMgPSByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcywNCiAgICAgICAgICMgcmVudGFfdG90YWxfY3J1ZG8gPSByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2NydWRvLA0KICAgICAgICAgKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGF1dG9yLCBldmVyeXRoaW5nKC4pLCANCiAgICAgICAgIC1jKGlwY18xOCwgdGNjLCB0Y3AsIHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2NydWRvLCByZW50YV9leHBvX3NvYnJldmFsdWFkYV9nYXMsDQogICAgICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcywgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19jcnVkbykpICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fZGVfcmVudGEsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgNDpuY29sKC4pKSAlPiUgDQogICAgYmluZF9yb3dzKHJlbnRhX2F1dG9yZXMpDQojIyMjIw0KDQoNCiNncmFmaWNvIGNvbXBhcmFjaW9uIGNvbiBvdHJvcyBhdXRvcmVzDQpncmFmX3RpcG9zX3JlbnRhIDwtIHJlbnRhX2F1dG9yZXMgJT4lIA0KICBmaWx0ZXIoISh0aXBvX2RlX3JlbnRhJWluJSBjKCJyZW50YV90b3RhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVudGFfZXN0YWRvX3RvdGFsIikpKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gYXV0b3IpKSsNCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoc2l6ZSA9IDAuNSkrDQogIGZhY2V0X3dyYXAofnRpcG9fZGVfcmVudGEsIHNjYWxlcyA9ICJmcmVlX3kiKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSIsIA0KICAgICAgIHN1YnRpdGxlID0gIkNvbXBhcmFjacOzbiBkZSBlc3RpbWFjaW9uZXMuIE1pbGxvbmVzIFVTRCIsIA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgVVNEIikrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCmdncGxvdGx5KGdyYWZfdGlwb3NfcmVudGEsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA2MDApICANCg0KDQoNCmdyYWZfcmVudGFfdG90YWxfY29tcGFyYWNpb24gPC0gcmVudGFfYXV0b3JlcyAlPiUgDQogICMgZmlsdGVyKCEoYXV0b3IgPT0gIlByb3BpYSIgJiB0aXBvX2RlX3JlbnRhID09ICJyZW50YV90b3RhbCIpKSAlPiUNCiAgIyBtdXRhdGUodGlwb19kZV9yZW50YT0gY2FzZV93aGVuKHRpcG9fZGVfcmVudGEgPT0icmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvcyIgJg0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvciA9PSAiUHJvcGlhIiB+ICJyZW50YV90b3RhbCIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdGlwb19kZV9yZW50YSkpICU+JQ0KICBmaWx0ZXIodGlwb19kZV9yZW50YSA9PSAicmVudGFfdG90YWwiKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gYXV0b3IpKSsNCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIHRvdGFsIChwZXRyw7NsZW8geSBnYXMpIiwgDQogICAgICAgc3VidGl0bGUgPSAiQ29uIHJlbnRhIHRvdGFsIHByb3BpYSBtZXRvZG9sb2fDrWEgYXV0b3JlcyIsIA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgVVNEIikrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1mdW5jdGlvbih4KSBmb3JtYXQoeCwgYmlnLm1hcmsgPSAiLiIsIHNjaWVudGlmaWMgPSBGQUxTRSkpDQpncmFmX3JlbnRhX3RvdGFsX2NvbXBhcmFjaW9uDQoNCmdncGxvdGx5KGdyYWZfcmVudGFfdG90YWxfY29tcGFyYWNpb24sIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQojIGdncGxvdGx5KGdyYWZfcmVudGFfdG90YWxfY29tcGFyYWNpb25fYikNCg0KYGBgDQoNCiMgRXhwb3J0YWNpb24gZGUgcmVzdWx0YWRvcw0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiMjIEV4cG9ydGFjacOzbiBkZSByZXN1bHRhZG9zDQoNCndyaXRleGw6OndyaXRlX3hsc3gobGlzdChwcm9kdWNjaW9uX2NydWRvID0gcHJvZF9tZXJnZV9jcnVkbywgDQogICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2ludGVybm9fY3J1ZG8gPSBwcmVjaW9fbWlfY3J1ZG8sIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydGFjaW9uX2NydWRvID0gZXhwb19xX2NydWRvLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9zX2V4dGVybm9fY3J1ZG8gPSBwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y2Npb25fZ2FzID0gcHJvZF9tZXJnZV9nYXNfTU1CVFUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19pbnRlcm5vX2dhcyA9cHJlY2lvX2ludGVybm9fZ2FzX21tYnR1X3VzZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0YWNpb25fZ2FzID0gZXhwb19xX2dhcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2V4dGVybm9fZ2FzID0gcHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNpZGlvcyA9c3Vic2lkaW9zX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgZ2FuYW5jaWFfeV9wYmkgPSBnYW5hbmNpYV95X3BiaSwNCiAgICAgICAgICAgICAgICAgICAgICAgICB0aXBvX2NhbWJpbyA9IHRjcF9hbnVhbF9iLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGlwYyA9IGlwY19wcm9tZWRpbyksDQogICAgICAgICAgICAgICAgICAgIHBhdGggPSAgInJlc3VsdGFkb3MvYXJnZW50aW5hL3ZhcmlhYmxlcy54bHN4IikNCg0KY29lZmljaWVudGVzIDwtIGxpc3QoIlByb3BvcmNpw7NuIGRlIGxvcyBzZXJ2aWNpb3Mgc29icmUgZXh0cmFjY2lvbiIgPSBzZXJ2aWNpb19zX2V4dHJhY2Npb24sDQogICAgICAgICAgICAgICAgICAgICAiVGFzYSBkZSBkZXByZWNpYWNpw7NuIGRlIFlQRiIgPSBjb25zdW1vX2tfZmlqb195cGYsDQogICAgICAgICAgICAgICAgICAgICAiSW1wdWVzdG9zIHByb21lZGlvcyBNSVAgOTciID0gaW1wX3Byb21fOTcsDQogICAgICAgICAgICAgICAgICAgICAiQ29lZmljaWVudGUgdGVjbmljbyBNSVAgOTciID0gY29lZl90ZWNuaWNvXzk3LA0KICAgICAgICAgICAgICAgICAgICAgIlByb3BvcmNpw7NuIGRlIGxhIE1hc2EgU2FsYXJpYWwgdG90YWwgcHJvbWVkaW8gMjAwNC0yMDEyIj0gbWVhbl9jb2VmX21zJGNvZWZfbXNfdG90LA0KICAgICAgICAgICAgICAgICAgICAgIlByb3BvcmNpw7NuIGRlIGxhIE1hc2EgU2FsYXJpYWwgZXh0cmFjY2lvbiBwcm9tZWRpbyAyMDA0LTIwMTIiPSBtZWFuX2NvZWZfbXMkY29lZl9tc19leHRyLA0KICAgICAgICAgICAgICAgICAgICAgIkNvZWZpY2llbnRlIGNvbnN1bW8gaW50ZXJtZWRpbyAoQcOxbykiID1jb2VmX2NvbnN1bW9faW50ZXJtZWRpbyRhbmlvLA0KICAgICAgICAgICAgICAgICAgICAgIkNvZWZpY2llbnRlIGNvbnN1bW8gaW50ZXJtZWRpbyAoMS0gVkEvVkJQKSIgPWNvZWZfY29uc3Vtb19pbnRlcm1lZGlvJGNvZWZfY2kpDQoNCmNhcHR1cmUub3V0cHV0KGNvZWZpY2llbnRlcywgZmlsZSA9ICJyZXN1bHRhZG9zL2FyZ2VudGluYS9jb2VmaWNpZW50ZXMudHh0IikNCg0Kd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KG1ldG9kb19pbmRpcmVjdG8gPSByZW50YV9pbmRpcmVjdG9bLGMoMToxMywgMTcpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBjcnVkb19kaWZfcHJlY2lvc19tcyA9IHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvWywtMTRdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBnYXNfZGlmX3ByZWNpb3NfbXMgPSByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhc1ssLTEzXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNydWRvX3NvYnJldmFsdWFjaW9uX21zID0gcmVudGFfdGNwX2NydWRvWywtYygxMjoxMyldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FzX3NvYnJldmFsdWFjaW9uX21zID0gcmVudGFfdGNwX2dhcywNCiAgICAgICAgICAgICAgICAgICAgICAgICByZWdhbGlhcyA9IHJlZ2FsaWFzX3VzZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICByZXRlbmNpb25lcyA9IHJldGVuY2lvbmVzX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNpZGlvcyA9IHN1YnNpZGlvc19oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHJlbnRhX2JhbGFuY2VzID0gcmVudGFfcHJvZHVjY2lvbl9iYWxhbmNlcyAgKSwgDQogICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9hcmdlbnRpbmEvcmVudGFfbWV0b2RvX2luZGlyZWN0by54bHN4IikNCg0KDQp3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QodmFfY3JpdGVyaW9fcHJvcGlvID0gY3JpdGVyaW9fcHJvcGlvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRvZG9fZGlyZWN0byA9IHJlbnRhX2RpcmVjdG8pLA0KICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvYXJnZW50aW5hL3JlbnRhX21ldG9kb19kaXJlY3RvLnhsc3giKQ0KDQp3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoIG1ldG9kb19kaXJlY3RvX3BiaSA9IHJlbnRhX2RpcmVjdG9fcGJpWyxjKDEsMTQ6MTUpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBtZXRvZG9faW5kaXJlY3RvX3BiaT1yZW50YV9pbmRpcmVjdG9bLGMoMSwxOToyMCldKSwNCiAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL2FyZ2VudGluYS9yZW50YV9zb2JyZV9wYmkueGxzeCIpDQoNCndyaXRleGw6OndyaXRlX3hsc3gobGlzdChjY25uX29maWNpYWwgPSBjY25uX29maWNpYWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9fY2Nubj1jcml0ZXJpb19jY25uLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGVtcGFsbWVfY2Nubj1lbXBhbG1lX2Njbm4sDQogICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9fcHJvcGlvID1jcml0ZXJpb19wcm9waW8pLA0KICAgICAgICAgICAgICAgICAgICBwYXRoPSAiL0FyY2hpdm9zL3JlcG9zL2hpZHJvY2FyYnVyb3MvYW5hbGlzaXMvcmVzdWx0YWRvcy9hcmdlbnRpbmEvdmFsb3JfdG90YWxfcHJvZHVjY2lvbi54bHN4IikNCg0KDQp3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoY29tcGFyYWNpb25fYXV0b3JlcyA9IHJlbnRhX2F1dG9yZXMpLA0KICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvYXJnZW50aW5hL3JlbnRhX2NvbXBhcmFjaW9uX2F1dG9yZXMueGxzeCIpDQoNCg0Kd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KCAicmVudGEgZW1wcmVzYXMiID0gcmVudGFfZW1wcmVzYXNfYmFsYW5jZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9ja19iYWxhbmNlcyA9IHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRvX1lQRl9QZXRCUiA9dW5pb25fc2VnbWVudG9zKSwgDQogICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9hcmdlbnRpbmEvc3RvY2ssIHRnIHkgcmVudGEgZW1wcmVzYXMgYXJnZW50aW5hLnhsc3giKQ0KDQp3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoY29zdG9zX2Njbm49Y29zdG9zKSwNCiAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL2FyZ2VudGluYS9jb3N0b3NfY2Nubi54bHN4IikNCg0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdChwcm9kdWNjaW9uID0gcHJvZF9tZXJnZV9jcnVkbywgDQojICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRhY2lvbmVzID0gZXhwb19xX2NydWRvLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RlbmNpYXMgPSBleGlzdGVuY2lhc19wZXRyb2xlbywgDQojICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9faW50ZXJubyA9IHByZWNpb19taV9jcnVkbywgDQojICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9fZXh0ZXJubyA9IHByZWNpb3NfcmVmZXJlbmNpYV95X2V4cG9fY3J1ZG8sDQojICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3AgPSB0Y3BfYW51YWxfYiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bG8gPSByZW50YV9kaWZfcHJlY2lvc19jcnVkbyksIA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9yZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2NydWRvLnhsc3giKQ0KIyANCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KHByb2R1Y2Npb24gPSBwcm9kX21lcmdlX2dhc19NTUJUVSwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRhY2lvbmVzID0gZXhwb19xX2dhc19NTUJUVSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19pbnRlcm5vID0gcHJlY2lvX21pX2dhc19NTUJUVSwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9fZXh0ZXJubyA9IHByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcCA9IHRjcF9hbnVhbF9iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY3VsbyA9IHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzKSwgDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL3JlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzLnhsc3giKQ0KIyAjIA0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoImNvbiBwb3pvcyBwZXJmb3JhZG9zIHBvciBhw7FvIj0gc3RvY2tfZXN0aW1hZG8sIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbiBzdG9jayBkZSBwb3pvcyIgPSBlamVyY2ljaW9fZmRfc3RvY2ssDQojICAgICAgICAgICAgICAgICAgICAgICAgICAiYSBwYXJ0aXIgWVBGIChmbHVqbykiID0gZWplcmNpY2lvX2ZkX3lwZiksIA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9lc3RpbWFjaW9uIGRlIHN0b2NrIGEgcGFydGlyIGRlIHBvem9zLnhsc3giKQ0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdCgiY29uIHBvem9zIHBlcmZvcmFkb3MgcG9yIGHDsW8iPSBzdG9ja195X3Bvem9zKSwgDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL2VzdGltYWNpb24gZGUgc3RvY2sgYSBwYXJ0aXIgZGUgcG96b3MueGxzeCIpDQoNCiMgDQojIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdCgiZmx1am8iPSBjb21wYXJhY2lvbl9wb3pvcywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICJmbHVqb190b3RhbCI9IGxpc3RhZG9fcG96b3MsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAic3RvY2siID0gcG96b3NfaWFwZ19jZW50ZW5hcmlvKSwgDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL2FyZ2VudGluYS9wb3pvcy54bHN4IikNCiMgDQojIA0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoYWZpcCA9IHN0b2NrX2FmaXAsDQojICAgICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlc19ib2xzYXIgPSBzdG9ja19iYWxhbmNlc19lbXByZXNhcywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRvX1lQRl9QZXRCUiA9dW5pb25fc2VnbWVudG9zLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9sc2FyX3YyID0gc3RvY2tfYmFsYW5jZXNfcmFtYSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZlcnNpb24gcG9yIHBvem8gKElBUEcpIiA9IGludmVyc2lvbl9wb3pvcywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52ZXJzaW9uIHBvciBwb3pvIChDYXAgSVYpIj0gaW52ZXJzaW9uX3Bvem9zX2NhcGl2KSwNCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvYXJnZW50aW5hL3N0b2NrX3BldHJvbGVvLnhsc3giKQ0KIyANCg0KDQoNCnByaW50KCJFbCBjw7NkaWdvIHRlcm1pbsOzIGRlIGNvcnJlciIpDQoNCmBgYA0KDQoNCg0KDQoNCg0KDQo=